Contando primos de Eisenstein

8

Introdução

Os inteiros de Eisenstein são números complexos da forma

a+bω

Onde a,bestão os números inteiros e

ω = e^(2πi/3)

Os números inteiros de Eisenstein formam uma rede triangular no plano complexo:

Número inteiro de Eisenstein 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,bsã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

Meow Mix
fonte
2
Você poderia fornecer alguns casos de teste?
Alex A.
Eu não entendo os casos de teste. O número de a,bpares para 2é apenas 4então, como 5eles podem ser primos?
Maltysen
@Maltysen deixe-me reescrever a definição
Meow Mix
1
@ user3502615 eu estou falando sobre a parte em que você diz "são da forma a + bω para o qual a, b são números naturais (incluindo zero) a menos de n"
Maltysen
@Maltysen Existem 5 números: 2ω, 2ω + 1,2ω + 2, ω + 2 e 2
Meow Mix

Respostas:

1

Gelatina, 24 bytes

Rð_²+×µ€µ³RḊm3,µÆP×1¦3FS

Aproximadamente a mesma abordagem que minha resposta de Julia.

                          Initial argument: n
R                           Compute [1, 2, …, n]
 ð_²+×                      (λ, ρ) —→ (λ − ρ)² + λρ (which is λ² − λρ + ρ²)
      µ€                    Zip with itself. Call this Q.

        µ                 Refocus argument: Q
         ³                  The initial argument n
          RḊm3              Compute candidate green line primes: [2, 5, 8, …, n]
              ,             Call this P. Make pair with argument.

               µ          Refocus argument: [P, Q]
                ÆP          Check primality
                  ×1¦3      Multiply the first element by 3
                      FS    Sum everything
                            (The result is 3·countprimes(P) + countprimes(Q))
Lynn
fonte
8

Julia, 66 62 60 bytes

!n=sum(isprime,[a<1<b%3?b:a^2-a*b+b^2for a=[0;0;0:n],b=0:n])

Experimente online!

Explicação

Estamos interessados ​​nos números primos neste paralelogramo no plano complexo (exemplo para n = 4 ):

insira a descrição da imagem aqui

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 em bpelo 1quando a<1<b%3- então a expressão reduz-se b. Isso não parece ser mais curto, mas é legal!

Lynn
fonte