Esiste un algoritmo efficiente per il test di primalità per i numeri che sono nella forma usando la funzione radice quadrata?


8

Stavo leggendo CLRS e mi chiedeva di mostrare che se è un numero primo della forma e era un residuo quadratico, allora è una radice quadrata (si può anche facilmente dimostrare che è una radice quadrata).p4k+3aak+1ak

Mi chiedevo se usando il fatto precedente e anche che sapevamo di avere un numero della forma (non necessariamente primo), allora forse c'è un diverso test di primalità per (qualsiasi?) usando la funzione radice quadrata (ovvero ).N=4k+3NSQRTN(a)=ak+1

Quindi l'algoritmo che pensavo fosse il seguente:

Scegli un residuo quadratico (QR) (puoi farlo facilmente controllando se a ^ {\ frac {p-1} {2}} \ equiv 1 \ pmod p ). Una volta che abbiamo un QR, calcola a ^ {k + 1} = x_a e controlla se x_a ^ 2 è uguale a a . Se è vero, allora concludiamo che a è primo. Altrimenti, scegliamo un QR diverso a '\ in \ mathbb {Z} ^ * _ N e ripetiamo l'algoritmo. Si può ripetere questo algoritmo k volte. Se dopo k volte non c'è successo, concludi che il numero è composto.aZNap121(modp)ak+1=xaxa2aaaZNkk

Ho principalmente intuizioni sul perché sia ​​una prova corretta ma non formale. Dal primo fatto che xa=ak+1 è una radice quadrata quando p è primo, deve significare che xa2a(modp) . Pertanto, se a è un QR, quel controllo passerà (metà del tempo sceglieremo un QR, quindi probabilmente il fatto che scegliamo un non QR è solo 1/2).

Tuttavia, se N è composito, sembra che abbiamo alcuna garanzia che xa2a(modN) . Quindi se non regge siamo sicuri che non sia un numero primo. Ma se regge allora se il suo primo è giusto, ma se il suo composito potremmo essere sbagliato? Fondamentalmente, è possibile usare la funzione SQRT quando N=4k+3 per decidere se N è primo o no?


Ho anche pensato a un altro algoritmo che meritava una sua domanda: il calcolo di una radice quadrata di un numero e avere più di 2 radici è un modo affidabile per decidere la primalità?


@Kyle Jones, hai qualche possibilità che tu sia disposto a ripristinare (ripristinare) la tua risposta? Penso che abbia una buona intuizione - non l'ho apprezzato del tutto a prima vista, ma a un'ulteriore ispezione penso che sia un buon esempio.
DW

@DW OK. Non pensavo avesse molto valore data la tua risposta più completa, ma la riporterò indietro se pensi che valga la pena.
Kyle Jones,

Ho avuto una nuova idea dopo aver recensito Miller-Rabin. Cosa ne pensi del mio algoritmo appena proposto? @KyleJones
Charlie Parker il

@CharlieParker Se hai una nuova domanda, dovresti farla in un post separato. Se modifichi questa domanda in modo da invalidare le risposte esistenti, vanifica lo scopo di disporre di un archivio di domande e risposte.
Kyle Jones,

@KyleJones è difficile decidere perché si tratta davvero dello stesso argomento. Che cosa suggerisci? Posso aprire una nuova domanda, non ero sicuro che fosse appropriato.
Charlie Parker,

Risposte:


5

Vorrei iniziare con un controesempio in cui il tuo algoritmo fornisce la risposta sbagliata: vale a dire, dove è composto ma il tuo algoritmo conclude che è primo. Supponiamo che e . Quindi , quindi passa il controllo per essere un QR. Inoltre, e , quindi questo supera il tuo secondo test, il tuo algoritmo concludere che 91 è primo. Tuttavia, 91 non è un numero primo: . Quindi il tuo algoritmo ha tratto una conclusione sbagliata in questo caso. Ciò dimostra che l'algoritmo può generare risposte errate in almeno alcuni casi.NN=91a=9a(N1)/2=9451(mod91)aa(N+1)/4=92381(mod91)8129(mod91)91=7×13


In realtà, c'è un problema più serio con il tuo algoritmo. Non esiste un numero cui l'algoritmo produrrà mai "composito". Pensa che tutti i numeri siano numeri primi. Più precisamente, per ogni , il tuo algoritmo o eseguirà il loop per sempre (cercando di trovare un numero che supera il test QR, invano), oppure terminerà e genererà "prime". Quindi, il tuo algoritmo è nel modo più sbagliato possibile.NN

Puoi vederlo applicando una teoria dei numeri. Hai un test se è un QR e un secondo test basato sull'intuizione della radice quadrata. Se supera il primo test, passerà il secondo.aa

Ecco perché. Il test ha esito positivo se QR . Il tuo secondo test ha esito positivo se . Quest'ultimo è equivalente ad . Ma . Pertanto, se , quindi (moltiplicando entrambi i lati per ) vediamo immediatamente che dobbiamo avere .a(N1)/21(modN)(a(N+1)/4)2a(modN)a(N+1)/2a(modN)a(N+1)/2a×a(N1)/2(modN)a(N1)/21(modN)aa(N+1)/2a(modN)

Ciascuno dei passaggi del tuo algoritmo equivale sostanzialmente alla ricerca di un che supera il primo test, quindi a verificare se supera il secondo test - ma in base alle intuizioni precedenti, vediamo che qualsiasi che supera il primo test sarà assicurarsi di superare anche il secondo test. Pertanto, se l'algoritmo trova mai un valore che supera il test QR, il secondo test passerà automaticamente e l'algoritmo produrrà "prime".kaaa

La lezione da imparare: ogni volta che pensi di avere un algoritmo che sembra promettente, vale la pena codificarlo e provarlo su alcuni casi di test e vedere se sembra funzionare bene. Provarlo su alcuni casi di test non è un sostituto per una prova di correttezza , ma può essere un modo utile per eliminare rapidamente un algoritmo errato.


Infine, alla tua vera domanda: possiamo usare qualcosa del genere per costruire un test di primalità? Bene, puoi pensare al test di primalità di Miller-Rabin come vagamente basato su qualcosa del genere. Si basano su una caratterizzazione di come dovrebbero apparire le radici quadrate di , se è primo. Se incontri una radice quadrata di che non è o , puoi concludere che non è primo. Tuttavia, non è limitato ai numeri della forma , quindi in questo senso è decisamente diverso.1N111NNN=4k+3


Ho avuto una nuova idea dopo aver recensito Miller-Rabin. Cosa ne pensi del mio algoritmo appena proposto?
Charlie Parker,

1
@CharlieParker, piuttosto che modificare la domanda in modo da invalidare le risposte esistenti, di solito preferiamo che tu faccia una nuova domanda. Ti suggerisco di farlo. (Suggerimento: pensa a come pensi di calcolare sqrt ...)
DW

3

La congruenza è vera per tutti i numeri primi della forma corretta, ma è anche vera per alcuni numeri composti, il che rende la congruenza da sola inutile come test di primalità.p

Esempio: imposta sul numero , che è ovviamente composito ed è della forma con . è , quindi mod produce il residuo quadratico = . = = ; applicando mod a ciò si ottiene . Ora il test: in mod dovrebbe essere la radice quadrata di ( ) solo se è primo, map154k+3k=31000010021000015a1010k+110410000p10p 10a10p102 = che è mod , quindi ha superato il test primailty. Tuttavia sappiamo che è composito.10010ppp

Ciò sta dimostrando che anche se il tuo metodo per selezionare i QR è perfetto, l'algoritmo può ancora sbagliare. Ad esempio, qui sarebbe un modo ragionevole di scegliere : scegli un numero casuale , quadralo e chiama risultato (cioè ). Quindi sai che è garantito per essere un QR e non è necessario testarlo utilizzando il test che hai elencato. Se è così che l'algoritmo ha scelto , l'esempio sopra mostra che l'algoritmo può dare la risposta sbagliata in alcuni casi (ad esempio, , ).araa=r2modNaap=15r=5


Mi chiedo se ci sia un errore da qualche parte nei tuoi calcoli, o se fraintendo l'algoritmo proposto. non supera il test QR: , non . Pertanto, secondo la mia comprensione dell'algoritmo proposto, non verrebbe accettato come QR e l'algoritmo non proverebbe a fare ulteriori calcoli con esso. Suppongo che il modo in cui l'algoritmo trova un QR accettabile sia quello di scegliere caso caso e verificare se ; quello sembra essere ciò che il testo suggerisce. a=10a(N1)/2=10710(mod15)1a=10aa(N1)/21(modN)
DW

@DW OK. La tua risposta è comunque del tutto migliore.
Kyle Jones,

1
Ahh, guardando un po 'più da vicino, vedo cosa sta succedendo: 10 è davvero un QR, ma il controllo pensa erroneamente che non sia un QR. Quindi, se il modo in cui l'algoritmo ha funzionato per scegliere un numero casuale , quadrarlo e chiamare risultato (cioè ), allora la tua risposta sarebbe un controesempio valido - e questo non è un'interpretazione irragionevole dell'algoritmo proposto. Bella, bella risposta! a(N1)/2=1(modN)raa=r2modN
DW
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.