Quando il test di primalità AKS è effettivamente più veloce di altri test?


24

Sto cercando di farmi un'idea di come interpretare il test di primalità AKS mentre lo apprendo, ad esempio un corollario per dimostrare che PRIMES ⊆ P, o un algoritmo realmente pratico per il test di primalità sui computer.

Il test ha un runtime polinomiale ma con alto grado e possibili alte costanti. Quindi, in pratica, a quale n supera altri test di primalità? Qui n è il numero di cifre del numero primo e "surpass" si riferisce al tempo di esecuzione approssimativo dei test su architetture di computer tipiche.

Sono interessato a algoritmi funzionalmente comparabili, ovvero deterministici che non necessitano di congetture per correttezza.

Inoltre, utilizzare un test di questo tipo rispetto agli altri è pratico alla luce dei requisiti di memoria del test?

Risposte:


23

Risposta rapida: mai, per scopi pratici. Al momento non è di alcuna utilità pratica.

Tempi di primalità misurati

Innanzitutto, separiamo i test di "pratica" compositeness dalle prove di primalità. Il primo è abbastanza buono per quasi tutti gli scopi, anche se ci sono diversi livelli di test che la gente ritiene adeguati. Per numeri inferiori a 2 ^ 64, non è necessario più di 7 test di Miller-Rabin o un test BPSW per una risposta deterministica. Questo sarà molto più veloce di AKS e sarà altrettanto corretto in tutti i casi. Per numeri superiori a 2 ^ 64, BPSW è una buona scelta, con alcuni test Miller-Rabin su base casuale che aggiungono un po 'di confidenza in più a costi molto bassi. Quasi tutti i metodi di prova inizieranno (o dovrebbero) con un test come questo perché è economico e significa che facciamo solo il duro lavoro su numeri che sono quasi certamente primi.

Passando alle prove. In ogni caso la dimostrazione risultante non richiede congetture, quindi queste possono essere confrontate funzionalmente. Il "gotcha" di APR-CL è che non è abbastanza polinomiale, e il "gotcha" di ECPP / fastECPP è che potrebbero esistere numeri che richiedono più tempo del previsto.

Nel grafico, vediamo due implementazioni AKS open source: la prima tratta dal documento v6, la seconda che include miglioramenti da Bernstein e Voloch e una bella euristica r / s da Bornemann. Questi usano la segmentazione binaria in GMP per i moltiplicatori polinomiali, quindi sono piuttosto efficienti e l'uso della memoria non è un problema per le dimensioni considerate qui. Producono belle linee rette con una pendenza di ~ 6,4 sul grafico log-log, il che è fantastico. Ma estrapolare fino a 1000 cifre arriva a tempi stimati tra le centinaia di migliaia a milioni di anni, rispetto a pochi minuti per APR-CL ed ECPP. Ci sono ulteriori ottimizzazioni che potrebbero essere fatte dal documento di Bernstein del 2002, ma non credo che ciò cambierà materialmente la situazione (anche se fino a quando ciò non sarà dimostrato).

Alla fine AKS batte la divisione di prova. Il metodo del teorema BLS75 5 (ad es. Prova n-1) richiede il factoring parziale di n-1. Funziona alla grande con piccole dimensioni, e anche quando siamo fortunati e n-1 è facile da considerare, ma alla fine resteremo bloccati a dover considerare alcuni semi-primi di grandi dimensioni. Ci sono implementazioni più efficienti, ma in realtà non scala oltre 100 cifre a prescindere. Possiamo vedere che AKS passerà questo metodo. Quindi, se ponevi la domanda nel 1975 (e allora aveva l'algoritmo AKS), potremmo calcolare il crossover per cui AKS era l'algoritmo più pratico. Ma alla fine degli anni '80, l'APR-CL e altri metodi ciclotomici erano il confronto corretto e alla metà degli anni '90 avremmo dovuto includere l'ECPP.

I metodi APR-CL ed ECPP sono entrambe implementazioni open source. Primo (ECPP gratuito ma non open source) sarà più veloce per cifre di dimensioni maggiori e sono sicuro che abbia una curva più bella (non ho ancora fatto nuovi benchmark). APR-CL è non polinomiale, ma l'esponente ha un fattore logloglogn che, come qualcuno ha scherzato "va all'infinito, ma non è mai stato osservato per farlo". Questo ci porta a credere che in teoria le linee non si incrociassero per nessun valore di n dove AKS sarebbe finito prima che il nostro sole si esaurisse. ECPP è un algoritmo di Las Vegas, in quanto quando riceviamo una risposta è corretta al 100%, ci aspettiamo un risultato in congetture O(log5+ε(n)) (ECPP) oO(log4+ε(n)) ("fastECPP") tempo, ma potrebbero esserci numeri che richiedono più tempo. Quindi la nostra aspettativa è che l'AKS standard sarà sempre più lento dell'ECPP per quasi tutti i numeri (certamente lo ha dimostrato per numeri fino a 25k).

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

Alcuni di questi algoritmi possono essere facilmente parallelizzati o distribuiti. AKS molto facilmente (ciascuno dei test è indipendente). L'ECPP non è troppo difficile. Non sono sicuro di APR-CL.

I metodi ECPP e BLS75 producono certificati che possono essere verificati in modo indipendente e rapido. Questo è un enorme vantaggio rispetto a AKS e APR-CL, dove dobbiamo solo fidarci dell'implementazione e del computer che lo ha prodotto.


18

O~(log6n)O~(log4n)O~(n1/7)O(lognO(logloglogn))

O~(log2n)2-80O~(log2n)

In tutti questi test, la memoria non è un problema.


Nel loro commento, jbapple solleva il problema di decidere quale test di primalità usare nella pratica. Questa è una questione di implementazione e benchmarking: implementare e ottimizzare alcuni algoritmi e determinare sperimentalmente quale è il più veloce in quale intervallo. Per i curiosi, i programmatori di PARI hanno fatto proprio questo, e hanno scoperto una funzione deterministica isprimee una funzione probabilistica ispseudoprime, che possono essere trovate qui . Il test probabilistico utilizzato è Miller – Rabin. Quello deterministico è BPSW.


Ecco ulteriori informazioni da Dana Jacobsen :

Pari dalla versione 2.3 utilizza una prova di primalità APR-CL isprime(x)e un probabile primo test BPSW (con test Lucas "quasi extra forte") per ispseudoprime(x).

Prendono argomenti che cambiano il comportamento:

  • isprime(x,0) (impostazione predefinita.) Utilizza la combinazione (BPSW, teorema 5 di Pocklington o BLS75 rapido, APR-CL).
  • isprime(x,1)n-1
  • isprime(x,2) Utilizza APR-CL.

  • ispseudoprime(x,0) (impostazione predefinita.) Utilizza BPSW (MR con base 2, Lucas "quasi extra forte").

  • ispseudoprime(x,k)K1Kmpz_is_probab_prime_p(x,k)

Pari 2.1.7 ha utilizzato una configurazione molto peggiore. isprime(x)erano solo i test MR (valore predefinito 10), che portavano a cose divertenti come il isprime(9)ritorno vero abbastanza spesso. L'utilizzo isprime(x,1)farebbe una prova di Pocklington, che andava bene per circa 80 cifre e quindi diventava troppo lenta per essere generalmente utile.

In realtà scrivi anche che nessuno usa questi algoritmi, poiché sono troppo lenti. Credo di sapere cosa intendi, ma penso che questo sia troppo forte a seconda del tuo pubblico. L'AKS ovviamente è incredibilmente lento, ma APR-CL ed ECPP sono abbastanza veloci che alcune persone li usano. Sono utili per la criptovaluta paranoica e utili per le persone che fanno cose come primegapso in factordbcui si ha abbastanza tempo per desiderare numeri primi comprovati.

[Il mio commento su questo: quando cerchiamo un numero primo in un intervallo specifico, utilizziamo un approccio di setacciatura seguito da alcuni test probabilistici relativamente rapidi. Solo allora, se non del tutto, eseguiamo un test deterministico.]

In tutti questi test, la memoria non è un problema. È un problema per AKS. Vedi, ad esempio, questa eprint . Alcuni di questi dipendono dall'implementazione. Se si implementa ciò che il video di numberphile chiama AKS (che in realtà è una generalizzazione del piccolo teorema di Fermat), l'uso della memoria sarà estremamente elevato. L'uso di un'implementazione NTL dell'algoritmo v1 o v6 come il documento di riferimento comporterà stupide grandi quantità di memoria. Una buona implementazione di GMP v6 utilizzerà ancora ~ 2 GB per un prime a 1024 bit, che è un moltodi memoria per un numero così piccolo. L'uso di alcuni dei miglioramenti di Bernstein e della segmentazione binaria GMP porta a una crescita molto migliore (ad es. ~ 120 MB per 1024 bit). Questo è ancora molto più grande di quello di cui hanno bisogno altri metodi, e nessuna sorpresa, sarà milioni di volte più lento di APR-CL o ECPP.


2
Non credo che questo risponda alla domanda come posta, che richiederebbe il calcolo delle costanti di questi test.
jbapple,

1
Usa i tuoi voti negativi ogni volta che incontri un post egregiamente sciatto, senza sforzo, o una risposta che è chiaramente e forse pericolosamente errata. - Non riesco a vedere come la persona che ha votato per difetto questa risposta giustifichi il voto.
Pål GD,

2
n

@Raphael Hai ragione, loro n è mio logn.
Yuval Filmus,

Buon post, ma la tua definizione di "nessuno" è mai leggermente off. Per curiosità, ho provato quanto tempo ci vuole per verificare un probabile primo DSA a 2048 bit generato con OpenSSL (usando openssl pkeyparam -textper estrarre la stringa esadecimale) usando PARI isprime(APR-CL come detto): circa 80s su un notebook veloce. Per riferimento, Chromium ha bisogno di poco più di 0,25 per ogni iterazione della mia implementazione demo JavaScript del test Frobenius (che è molto più forte di MR), quindi APR-CL è sicuramente paranoico ma fattibile.
Arne Vogel,

2

questa è una domanda complicata a causa di quelle che sono conosciute come "costanti grandi / galattiche" associate alle flessioni tra efficienze di diversi algoritmi. in altre parole ilO(f(n)) associati a ciascun algoritmo diverso possono nascondere costanti molto grandi in modo tale che un più efficiente O(f(n)) sopra un altro O(g(n)) basato sulla complessità asintotica / funzione "entra" solo per dimensioni molto grandi n. la mia comprensione è che AKS è "più efficiente" (rispetto agli algoritmi concorrenti) solo per "molto più granden"fuori dalla portata dell'attuale uso pratico (e preciso n è in realtà molto difficile da calcolare esattamente), ma i miglioramenti teorici sull'implementazione dell'algoritmo (attivamente ricercati da alcuni) potrebbero cambiarlo in futuro.

visto questo recente articolo su arxiv che analizza questo argomento in modo approfondito / dettagliato, non sono sicuro di cosa la gente ne pensi, finora non ho sentito reazioni, sembra forse una tesi creata dagli studenti, ma forse una delle analisi più dettagliate / complete di utilizzo pratico dell'algoritmo disponibile.


AKS è più efficiente di cosa? Qual è la competizione?
Yuval Filmus,

tutti gli altri algoritmi. principalmente probabilistico? dettagli nel documento
vzn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.