Quando o teste de primalidade da AKS é realmente mais rápido do que outros testes?


24

Estou tentando ter uma idéia de como o teste de primalidade do AKS deve ser interpretado à medida que o aprendo, por exemplo, um corolário para provar que PRIMES ⊆ P, ou um algoritmo realmente prático para o teste de primalidade em computadores.

O teste tem tempo de execução polinomial, mas com alto grau e possíveis constantes altas. Então, na prática, em que supera outros testes de primalidade? Aqui, n é o número de dígitos do primo e "supera" refere-se ao tempo de execução aproximado dos testes em arquiteturas de computador típicas.nn

Estou interessado em algoritmos funcionalmente comparáveis, que são determinísticos que não precisam de conjecturas para correção.

Além disso, é prático usar esse teste em relação aos outros, dados os requisitos de memória do teste?

Respostas:


23

Resposta rápida: nunca, para fins práticos. Atualmente não é de uso prático.

Tempos de primalidade medidos

Primeiro, vamos separar o teste de composição "prático" das provas de primalidade. O primeiro é bom o suficiente para quase todos os propósitos, embora existam diferentes níveis de teste que as pessoas consideram adequados. Para números abaixo de 2 ^ 64, não são necessários mais de 7 testes de Miller-Rabin ou um teste de BPSW para uma resposta determinística. Isso será muito mais rápido que o AKS e será igualmente correto em todos os casos. Para números acima de 2 ^ 64, o BPSW é uma boa opção, com alguns testes adicionais de base aleatória de Miller-Rabin, adicionando mais confiança por um custo muito baixo. Quase todos os métodos de prova começarão (ou deveriam) com um teste como esse, porque é barato e significa que só fazemos o trabalho duro com números quase certamente primos.

Passando para as provas. Em cada caso, a prova resultante não requer conjecturas; portanto, elas podem ser comparadas funcionalmente. A "pegadinha" do APR-CL é que não é bem polinomial, e a "pegadinha" do ECPP / fastECPP é que podem existir números que demoram mais que o esperado.

No gráfico, vemos duas implementações de software livre AKS - a primeira do artigo v6, a segunda incluindo melhorias de Bernstein e Voloch e uma boa heurística de r / s de Bornemann. Eles usam segmentação binária no GMP para as multiplicações polinomiais, por isso são bastante eficientes e o uso de memória não é um problema para os tamanhos considerados aqui. Eles produzem boas linhas retas com uma inclinação de ~ 6,4 no gráfico de log-log, o que é ótimo. Mas extrapolar para 1.000 dígitos chega em tempos estimados entre centenas e milhares e milhões de anos, contra alguns minutos para APR-CL e ECPP. Existem outras otimizações que poderiam ser feitas a partir do artigo de Bernstein de 2002, mas não acho que isso mude materialmente a situação (embora até a implementação isso não esteja comprovado).

Eventualmente, a AKS vence a divisão de testes. O método do teorema BLS75 5 (por exemplo, prova n-1) requer fatoração parcial de n-1. Isso funciona muito bem em tamanhos pequenos, e também quando temos sorte e o n-1 é fácil de fatorar, mas eventualmente ficaremos presos tendo que fatorar alguns semi-primos grandes. Existem implementações mais eficientes, mas realmente não ultrapassam os 100 dígitos, independentemente. Podemos ver que o AKS passará nesse método. Portanto, se você fez a pergunta em 1975 (e tinha o algoritmo AKS naquela época), poderíamos calcular o cruzamento de onde o AKS era o algoritmo mais prático. Mas no final dos anos 80, o APR-CL e outros métodos ciclotômicos eram a comparação correta e, em meados dos anos 90, teríamos que incluir o ECPP.

Os métodos APR-CL e ECPP são implementações de código aberto. O Primo (ECPP gratuito, mas não de código aberto) será mais rápido para tamanhos de dígitos maiores e tenho certeza que tem uma curva melhor (ainda não fiz novos testes comparativos). O APR-CL não é polinomial, mas o expoente possui um fator logloglogn que, como alguém brincou "vai ao infinito, mas nunca foi observado". Isso nos leva a crer que, em teoria, as linhas não se cruzariam para nenhum valor de n onde AKS terminaria antes que nosso sol se dissolvesse. O ECPP é um algoritmo de Las Vegas, pois quando obtemos uma resposta 100% correta, esperamos um resultado em O(log5+ϵ(n)) conjecturado ( log 5 + ϵ ( n ) ) (ECPP) ouO(log4+ϵ(n)) ("fastECPP"), mas pode haver números que demoram mais tempo. Portanto, nossa expectativa é que o AKS padrão seja sempre mais lento que o ECPP para quase todos os números (certamente se mostrou assim para números de até 25 mil dígitos).

O(log4+ϵ(n))(lgn)4+o(1)(lgn)4+o(1)

Alguns desses algoritmos podem ser facilmente paralelizados ou distribuídos. AKS com muita facilidade (cada teste é independente). O ECPP não é muito difícil. Não tenho certeza sobre o APR-CL.

Os métodos ECPP e BLS75 produzem certificados que podem ser verificados de forma independente e rápida. Essa é uma enorme vantagem sobre o AKS e o APR-CL, onde apenas precisamos confiar na implementação e no computador que o produziu.


18

O~(registro6n)O~(registro4n)O~(n1/7)O(registronO(registroregistroregistron))

O~(registro2n)2-80O~(registro2n)

Em todos esses testes, a memória não é um problema.


Em seu comentário, a jbapple levanta a questão de decidir qual teste de primalidade usar na prática. Essa é uma questão de implementação e benchmarking: implemente e otimize alguns algoritmos e determine experimentalmente qual é o mais rápido em qual intervalo. Para os curiosos, os codificadores do PARI fizeram exatamente isso e criaram uma função determinística isprimee uma função probabilística ispseudoprime, as quais podem ser encontradas aqui . O teste probabilístico usado é Miller – Rabin. O determinista é o BPSW.


Aqui está mais informações de Dana Jacobsen :

A Pari desde a versão 2.3 usa uma prova de primalidade APR-CL para isprime(x), e o provável teste principal BPSW (com teste Lucas "quase extra forte") para ispseudoprime(x).

Eles aceitam argumentos que mudam o comportamento:

  • isprime(x,0) (padrão.) Usa combinação (BPSW, Pocklington rápido ou teorema BLS75 5, APR-CL).
  • isprime(x,1) Utiliza o teste de Pocklington – Lehmer (simples n-1
  • isprime(x,2) Usa APR-CL.

  • ispseudoprime(x,0) (padrão.) Usa BPSW (MR com base 2, Lucas "quase extra forte").

  • ispseudoprime(x,k)k1kmpz_is_probab_prime_p(x,k)

O Pari 2.1.7 usou uma configuração muito pior. isprime(x)foram apenas testes de RM (padrão 10), que levaram a coisas divertidas como isprime(9)retornar à realidade com bastante frequência. O uso isprime(x,1)faria uma prova de Pocklington, que era boa para cerca de 80 dígitos e depois se tornava muito lenta para ser geralmente útil.

Você também escreve Na realidade, ninguém usa esses algoritmos, pois eles são muito lentos. Acredito que sei o que você quer dizer, mas acho que isso é muito forte, dependendo do seu público. É claro que o AKS é estupendamente lento, mas o APR-CL e o ECPP são rápidos o suficiente para que algumas pessoas os usem. Eles são úteis para criptografia paranóica e úteis para pessoas que fazem coisas como primegapsou factordbonde a pessoa tem tempo suficiente para querer números primos comprovados.

[Meu comentário sobre isso: ao procurar um número primo em um intervalo específico, usamos alguma abordagem de peneiração seguida por alguns testes probabilísticos relativamente rápidos. Somente então, se for o caso, executamos um teste determinístico.]

Em todos esses testes, a memória não é um problema. É um problema para a AKS. Veja, por exemplo, esta impressão digital . Parte disso depende da implementação. Se alguém implementar o que o vídeo de numberphile chama de AKS (que na verdade é uma generalização do pequeno teorema de Fermat), o uso de memória será extremamente alto. O uso de uma implementação NTL do algoritmo v1 ou v6, como o artigo mencionado, resultará em grandes quantidades de memória estúpidas. Uma boa implementação de v6 GMP ainda usará ~ 2 GB para um prime de 1024 bits, o que é muitode memória para um número tão pequeno. O uso de algumas das melhorias de Bernstein e a segmentação binária de GMP levam a um crescimento muito melhor (por exemplo, ~ 120 MB para 1024 bits). Isso ainda é muito maior do que outros métodos precisam, e nenhuma surpresa, será milhões de vezes mais lento que o APR-CL ou ECPP.


2
Não creio que isso responda à pergunta apresentada, o que exigiria o cálculo das constantes desses testes.
Jbapple

1
Use seus votos negativos sempre que encontrar uma postagem flagrantemente desleixada e sem esforço ou uma resposta que seja clara e talvez perigosamente incorreta. - Não vejo como a pessoa que deu o voto negativo nesta resposta justifica a votação.
GD

2
n

nregistron

Boa postagem, mas sua definição de "ninguém" é um pouco diferente. Por curiosidade, testei quanto tempo leva para verificar um provável provável DSA de 2048 bits gerado com o OpenSSL (usando openssl pkeyparam -textpara extrair a cadeia hexadecimal) usando os PARI's isprime(APR-CL como indicado): cerca de 80s em um notebook rápido. Para referência, o Chromium precisa de um pouco mais de 0,25s para cada iteração da minha implementação de demonstração JavaScript do teste Frobenius (que é muito mais forte que o MR), portanto o APR-CL é certamente paranóico, mas factível.
Arne Vogel

2

O(f(n))O(f(n))O(g(n))nnn

vi esse artigo recente sobre o arxiv, que analisa esse tópico em profundidade / detalhe, sem saber o que as pessoas pensam dele, não ouviu reações até agora, parece uma tese criada por um aluno, mas possivelmente uma das análises mais detalhadas / abrangentes de uso prático do algoritmo disponível.


AKS é mais eficiente do que o que? Qual é a competição?
Yuval Filmus

todos os outros algoritmos. principalmente probabilistc? detalhes no documento
vzn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.