Introdução
Os inteiros de Eisenstein são números complexos da forma
a+bω
Onde a,b
estão os números inteiros e
ω = e^(2πi/3)
Os números inteiros de Eisenstein formam uma rede triangular no plano complexo:
Dizemos que um número inteiro de Eisenstein z=a+bω
é primo se não puder ser escrito como o produto de duas unidades não-unitárias (não 1, -1, ω, -ω, ω ^ 2 ou -ω ^ 2) inteiros de Eisenstein
Programa
Entrada : um número natural n
.
Saída : O número de primos Eisenstein que são da forma a+bω
para o qual a,b
são números naturais (incluindo zero) menos do que ou igual an
Casos de teste
0 → 0
1 → 0
2 → 5
3 → 9
4 → 13
5 → 20
Pontuação
Isto é code-golf
, a menor quantidade de bytes ganha
code-golf
primes
hexagonal-grid
complex-numbers
Meow Mix
fonte
fonte
a,b
pares para2
é apenas4
então, como5
eles podem ser primos?Respostas:
Gelatina, 24 bytes
Aproximadamente a mesma abordagem que minha resposta de Julia.
fonte
Julia,
666260 bytesExperimente online!
Explicação
Estamos interessados nos números primos neste paralelogramo no plano complexo (exemplo para n = 4 ):
Podemos dividi-los em números primos nas linhas verdes e nas linhas cinza .
A Wikipedia me diz que o número Eisenstein z é uma linha verde Eisenstein prime iff | z | é um primo natural igual a 2 mod 3.
Também diz que z é uma linha cinza Eisenstein primo se s | z | ² = a² - ab + b² é um primo natural.
Então, nós laço sobre a = 0 ... n e b = 0 ... n , e verificação:
Se (a = 0 ou b = 0 ou a = b) e max (a, b)% 3 = 2 , conte se max (a, b) é primo.
Senão, conte se a² - ab + b² é primo.
No entanto, podemos abusar da simetria da distribuição. Em vez de contar cada linha verde uma vez, podemos apenas contar uma linha verde três vezes! Ou seja, apenas marque a = 0 e aumente o contador em três quando encontrarmos um prime de linha verde. O
a=[0;0;0:n]
consegue exatamente isso.Como sabemos que estamos considerando apenas a linha verde a = 0 , podemos substituir max (a, b) por b .
A “condição linha verde” está bem expressa em Julia usando encadeamento operador:
a<1<b%3
.(Para as linhas verdes restantes, nunca retornaremos um falso positivo: se a = b ou b = 0, então a² - ab + b² = a² , que não pode ser primo.)
Ideias
Talvez, em vez de escrever
a^2-a*b+b^2
, eu posso condicionalmente substituir o expoente emb
pelo1
quandoa<1<b%3
- então a expressão reduz-seb
. Isso não parece ser mais curto, mas é legal!fonte
CJam (34 bytes)
Demonstração online
fonte