Links relevantes aqui e aqui , mas aqui está a versão curta:
Você tem uma entrada de dois números inteiros a
e b
entre infinito negativo e infinito (embora, se necessário, eu possa restringir o intervalo, mas a função ainda deve aceitar entradas negativas).
Definição do símbolo Kronecker
Você deve retornar o símbolo Kronecker (a|b)
para entradas a
e b
onde
(a|b) = (a|p_1)^e_1 * (a|p_2)^e_2 * ... * (a|p_n)^e_n
onde b = p_1^e_1 * p_2^e_2 * ... * p_n^e_n
, e p_i
e e_i
são os primos e expoentes na fatoração primária de b
.
Para um primo ímpar p
, (a|p)=a^((p-1)/2) (mod p)
conforme definido aqui .
Para b == 2
,(n|2)={0 for n even; 1 for n odd, n=+/-1 (mod 8); -1 for n odd, n=+/-3 (mod 8)
Para b == -1
,(n|-1)={-1 for n<0; 1 for n>0
Se a >= b
, (a|b) == (z|b)
onde z == a % b
. Por essa propriedade, e conforme explicado aqui e aqui , a
é um resíduo quadrático de b
se z
é, mesmo assim a >= b
.
(-1|b)
= 1
se b == 0,1,2 (mod 4)
e -1
se b == 3 (mod 4)
. (0|b)
é 0
com exceção de (0|1)
que é 1
, porque (a|1)
é sempre 1
e para negativo a
, (-a|b) == (-1|b) * (a|b)
.
A saída do símbolo Kronecker é sempre -1, 0 or 1
, onde a saída é 0
if a
e b
possui fatores comuns. Se b
é um primo ímpar, (a|b) == 1
se a
é um resíduo quadrático mod b
, e -1
se for, não é um resíduo quadrático.
Regras
Seu código deve ser um programa ou uma função.
As entradas devem estar na ordem
a b
.A saída deve ser
-1
,0
ou1
.Isso é código de golfe, portanto, seu código não precisa ser eficiente, apenas curto.
Nenhum built-in que calcule diretamente o Kronecker ou os símbolos Jacobi e Legendre relacionados. Outros built-ins (para fatoração principal, por exemplo) são justos.
Exemplos
>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1
Essa é uma função complicada. Por favor, deixe-me saber se algo não está claro.
fonte
Respostas:
CJam (70 bytes)
Demonstração online (casos de teste gerados com o Mathematica).
Dissecação
Encontrei várias maneiras de avaliar
(a|2)
a mesma contagem de caracteres e optei por usar a com a apresentação mais clara.integer array <W=
O IMO é uma maneira bastante elegante de fazer fallbacks: se o número inteiro for maior que o comprimento da matriz, selecionamos o último elemento.Outros comentários
É decepcionante que, para o prime ímpar,
p
o estilo Fermat direto(a|p)
seja tão curto, porque existe uma maneira muito divertida de encontrar o(a|n)
positivo positivon
que eu queria usar. A base é o lema de Zolotarev:Isso foi reforçado por Frobenius para
e por Lerch para
Veja Brunyate e Clark, Estendendo a abordagem de Zolotarev-Frobenius à reciprocidade quadrática , The Ramanujan Journal 37.1 (2014): 25-50 para referências.
E pode ser facilmente fortalecido um passo adiante (embora eu não tenha visto isso na literatura) para
Prova: se
a
é coprime,b
então usamos Zolotarev-Frobenius-Lerch; caso contrário, o mapa não é uma permutação e o símbolo Levi-Civita é0
o desejado.Isso fornece o cálculo do símbolo de Jacobi
Mas o tratamento especial necessário
(a|-1)
e(a|2)
significa que eu não encontrei uma maneira de calcular o símbolo Kronecker, que é mais curto com essa abordagem: é mais curto fatorar e tratar os números primos individualmente.fonte
Python 3,
747369335 bytesComo resposta de exemplo, apenas jogue um pouco e para ter uma idéia de como será a resposta.
E sim, os bits de fatoração principal e de codificação do comprimento da execução são extraídos do Pyth com desculpas pelo isaacg .
fonte
Mathematica,
169175165 bytesfonte
LabVIEW, 44 bytes Primitivas do LabVIEW
Desde a sua simetria, troquei as entradas se a fosse maior que b.Representa a fórmula real agora
contando como sempre de acordo com
para o caso verdadeiro
fonte
(a|b) != (b|a)
em todos os casos. Na maioria dos casos, sim, mas não em todos eles. Embora funcionasse se você reduzisse ema mod b
vez de trocá-los.Julia, 195 bytes
Esta é uma função recursiva
k
que aceita dois números inteiros e retorna um número inteiro.Ungolfed:
fonte
Haskell, 286 bytes
Provavelmente não completamente otimizado, mas um esforço valente. O símbolo Kronecker é definido como a função infix a # b, ou seja,
fonte