O desafio é escrever o código mais rápido possível para calcular a permanente de uma matriz .
A permanente de uma matriz- n
by = ( ) é definida comon
A
a
i,j
Aqui S_n
representa o conjunto de todas as permutações de[1, n]
.
Como um exemplo (do wiki):
Nesta questão, as matrizes são todas quadradas e terão apenas os valores -1
e 1
nelas.
Exemplos
Entrada:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
Permanente:
-4
Entrada:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
Permanente:
0
Entrada:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
Permanente:
192
Entrada:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
Permanente:
1021509632
A tarefa
Você deve escrever um código que, dado n
porn
matriz, gera a permanente.
Como precisarei testar seu código, seria útil se você desse uma maneira simples de fornecer uma matriz como entrada para o seu código, por exemplo, lendo a partir do padrão em.
Esteja avisado de que a permanente pode ser grande (a matriz todos os 1s é o caso extremo).
Pontuações e laços
Testarei seu código em matrizes + -1 aleatórias de tamanho crescente e pararei na primeira vez em que o código demorar mais de 1 minuto no meu computador. As matrizes de pontuação serão consistentes para todos os envios, a fim de garantir justiça.
Se duas pessoas obtiverem a mesma pontuação, o vencedor será o mais rápido para esse valor de n
. Se estes estiverem a 1 segundo um do outro, será o primeiro publicado.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis que desejar, mas nenhuma função pré-existente para calcular a permanente. Onde for possível, seria bom poder executar seu código; portanto, inclua uma explicação completa de como executar / compilar seu código no Linux, se possível.
Implementações de referência
Já existe uma pergunta de codegolf com muitos códigos em diferentes idiomas para calcular a permanente para matrizes pequenas. O Mathematica e o Maple também possuem implementações permanentes, se você puder acessá-las.
Minha máquina Os tempos serão executados na minha máquina de 64 bits. Esta é uma instalação padrão do ubuntu com 8GB de RAM, processador de oito núcleos AMD FX-8350 e Radeon HD 4250. Isso também significa que eu preciso executar seu código.
Informações de baixo nível sobre minha máquina
cat /proc/cpuinfo/|grep flags
dá
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_md pfmd f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a desalinhamento 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb cpb hw_pstate vmmc
Farei uma pergunta multilíngue de acompanhamento intimamente relacionada que não sofre com o grande problema de Int, para que os amantes de Scala , Nim , Julia , Rust , Bash também possam mostrar seus idiomas.
Entre os melhores
- n = 33 (45 segundos. 64 segundos para n = 34). Ton Hospel em C ++ com g ++ 5.4.0.
- n = 32 (32 segundos). Dennis em C com o gcc 5.4.0 usando as bandeiras do gcc de Ton Hospel.
- n = 31 (54 segundos). Peneiradores cristãos em Haskell
- n = 31 (60 segundos). primo em rpython
- n = 30 (26 segundos). ezrast em Rust
- n = 28 (49 segundos). xnor com Python + pypy 5.4.1
- n = 22 (25 segundos). Shebang com Python + pypy 5.4.1
Nota . Na prática, os horários de Dennis e Ton Hospel variam muito por razões misteriosas. Por exemplo, eles parecem ser mais rápidos depois que eu carrego um navegador da web! Os tempos citados são os mais rápidos em todos os testes que fiz.