Cristiano Teodoro [email protected] 2 UN ALGORITMO PER LA RISOLUZIONE DELLA CONGRUENZA QUADRATICA z ≡ Q(mod p) ( AN ALGORITHM FOR SOLUTION OF QUADRATIC CONGRUENCES z 2 ≡ Q (mod p) Sommario: in questo articolo viene descritto un algoritmo per risolvere le congruenze quadratiche con modulo primo p di qualsiasi forma in modo molto più veloce ed efficace rispetto al banale algoritmo esaustivo. L’algoritmo proposto si basa sulle proprietà delle sequenze di Lucas. Dopo una breve premessa dedicata a chiarire il significato di congruenza e alla esposizione di formule risolutive per congruenze con moduli primi di forma particolare, vengono illustrate le sequenze di Lucas e le loro principali proprietà. Si passa quindi ad illustrare l’algoritmo la cui comprensione e realizzazione tocca sia argomenti della teoria dei numeri, quali le proprietà attinenti le congruenze, le cognizioni sui residui quadratici e non quadratici con una applicazione riguardante un efficiente algoritmo di calcolo del simbolo di Jacobi, sia l’utilizzo di originali formule di tipo iterativo per il calcolo di U(k) e V(k), previa la generazione di una conveniente successione dei loro indici.Per una migliore comprensione dell’algoritmo esposto si illustra una sua applicazione con un esempio che implica per ovvie ragioni di spazio valori numerici per Q e p costituiti da poche cifre. L’importanza di avere disponibile un algoritmo per una rapida e fattiva risoluzione di congruenze quadratiche con modulo p primo risulta evidente quando si pensi che il suo utilizzo è fondamentale ed indispensabile in uno dei più efficienti moderni metodi di fattorizzazione di un numero grande, il metodo del Crivello Quadratico (Quadratic Sieve). In allegato (Allegato1) è dato il listato in linguaggio Qbasic dell’algoritmo esposto riguardante congruenze quadratiche con valori del termine noto Q limitato a valori numerici costituiti al massimo da 15 cifre e a valori del modulo p con non più di 8 cifre, condizionamento questo dovuto alle limitazioni di precisione di calcolo della aritmetica a doppia precisione disponibile sul PC. L’algoritmo esposto si presta bene ad una sua programmazione con una aritmetica a precisione multipla in modo di poter trattare congruenze aventi termine noto Q sia positivo che negativo e modulo p primo grandi, costituiti anche da centinaia di cifre. E’ stato realizzato pertanto un più complesso programma sempre in Qbasic dove tutti i calcoli vengono realizzati in aritmetica a precisione multipla. Con tale programma si possono ottenere delle prestazioni di tempi di risoluzione estremamente più brevi rispetto a quelli ottenibili con un programma relativo al banale algoritmo esaustivo di risoluzione della congruenza. Non si è ritenuto opportuno allegare al presente articolo il suo listato, data la sua non indifferente lunghezza. Si allega invece una Tabella che riporta, ottenuti con tale programma, alcuni risultati di soluzioni di congruenze con valori sia piccoli che grandi di Q e di p con i tempi di calcolo riferibili ai due tipi di algoritmi: quello illustrato nell’articolo e quello di tipo esaustivo. Si riportano in allegato anche diversi esempi di risultati ottenuti. Vengono infine accennati i campi di applicazione e di utilizzo degli argomenti trattati, che non si limitano al solo campo della matematica, ma che toccano vari campi tecnologici, in particolare quello delle telecomunicazioni e della crittografia. Abstract: in this paper a fast algorithm for the exact resolution of quadratic congruences modulo any prime is proposed as on alternative to the trivial exhaustive method, very slower for high moduli (primes). The algorithm refers to the Lucas Sequences characteristics. After some preliminary remarks related to explain the congruence meaning and to show solution formulas for congruences with peculiar primes, we illustrate the main characteristics of these sequences. Then we explain the algorithm, whose understanding and implementation involves several elementary topics of the number theory, as the congruence properties, the quadratic and non quadratic residues, with an application pertaining to the Jacobi symbol calculus. So an original use of the U(k) and V(k) recurrence relation is illustrated, by previous production of a suitable sequence of k index .For a better understanding of the algorithm we show an application example with Q and p small values. The consequence of this algorithm is clear for its basic use in connection with the main Quadratic Sieve factorization method. We enclose in this article a program in Qbasic language of the algorithm (Allegato 1) , related to quadratic congruences with small values of Q and p input. This restriction is imposed by the use and the limits of double arithmetic precision. But the algorithm is suitable for a multiple precision arithmetic in order to handle congruences with large Q and modulus p, composed by several tens of digits or some hundred of digits. For this reason we have carried out a more complex program still in Qbasic language, but not enclosed to this paper. We achieve with this routine solution times much shorter compared to those realized by the trivial exhaustive algorithm. We report in a Table some examples of quadratic congruences solutions and of their computation times related to current and exhaustive algorithms as well some examples of solutions outputs. In the end we show briefly some technical application of the quadratic residues and quadratic congruence, related to the telecommunications and to the cryptography. 1 Introduzione Chiariamo innanzitutto il significato dell’espressione z 2 ≡ Q (mod p). Nel campo della teoria delle congruenze [Tch] le espressioni della forma M ≡ N (mod. A) sono note col nome di congruenze; i numeri interi M ed N si dicono congrui fra loro rispetto al numero A che si chiama modulo della congruenza; detti numeri M ed N possono essere positivi o negativi; in ogni caso la suddetta espressione indica la divisibilità algebrica di M – N per A dove A viene considerato sempre positivo. Nel nostro specifico caso l’espressione z 2 ≡ Q (mod p) è denominata congruenza binomia quadratica e si esprime dicendo che l’incognita z elevata al quadrato è congrua modulo p al termine noto Q. Con tale dizione si vuole significare che occorre trovare un valore dell’incognita z sempre se esiste, tale per cui il resto della divisione per p di essa elevata al quadrato sia il valore Q. Se la congruenza ha come modulo un numero primo p e risulta risolubile, ammette allora due soluzioni [Tch] ed il valore Q viene chiamato residuo quadratico di p. Se essa non ha soluzioni Q viene chiamato non residuo quadratico di p. Il numero p come già accennato prende il nome di modulo della congruenza. Per ora si prenderanno in considerazione per p solo numeri primi. Nella letteratura tecnica si conoscono diversi algoritmi [Cip], [Kra], [Rie], [Rob ], [Wag] dedicati alla risoluzione della congruenza z 2 ≡ Q (mod p) con p numero primo e Q ≠ 0 intero e primo con p. Quello banale della ricerca esaustiva di z estesa al limite sino al valore p , è senz’altro da scartare per la 2 durata eccessiva di calcolo anche per valori di p non molto grandi. E’ noto poi [Tch] che la risoluzione di tale tipo di congruenza binomia risulta indispensabile per risolvere la congruenza quadratica di forma generale ax 2 + bx + c ≡ 0 (mod p) dove a,b,c sono degli interi, p è primo, e a è primo con p. In effetti la suddetta congruenza ha soluzioni se e solo se la congruenza binomia z 2 ≡ q (mod p) derivata da essa ponendo z = 2ax +b e q = b 2 - 4ac , risulta risolubile. Inoltre, da quanto si deduce dalla teoria delle congruenze [Tch], appurato che la suddetta congruenza binomia z 2 ≡ q è risolubile e chiamate z1 e z 2 le sue due soluzioni, valgono le due seguenti congruenze lineari: 2a x1 + b ≡ z1 (mod p); 2a x 2 + b ≡ z 2 (mod. p) nelle incognite x1 e x 2 che, una volta trovate, risultano essere le due soluzioni della congruenza quadratica ax 2 + bx + c ≡ 0 (mod p). Esistono vari noti algoritmi, come ad esempio quello ideato da Eulero [Eul] o quello basato sulle frazioni continue [Old],[Te1] per risolvere una congruenza lineare, su cui non è il caso qui di soffermarsi. La risoluzione della z 2 ≡ Q (mod p) tramite algoritmi più o meno semplici dipende inoltre dalla forma di p: se tale primo è della forma 4k + 3 è ben noto [Tch] , [Rie] che i due valori di z soddisfacenti la congruenza, previa verifica della loro esistenza, sono dati dal resto della divisione di Q k +1 per p , vale a dire z1 ≡ Q k +1 (mod p) e z 2 = p – z1 . Il calcolo di z1 può essere pertanto effettuato con un efficiente algoritmo di esponenziazione modulare.. Diversi siti su Internet trattano questo algoritmo, ad esempio [SI0]. Per una sua esauriente esposizione e comprensione si rimanda all’esemplare articolo di C. Pomerance [Pom]. Nel caso poi in cui il primo p è della forma 8k + 5 le soluzioni della congruenza sono le seguenti [Cip]: p +3 Ovvero: p −1 p −1 p −1 1 z1 ≡ Q 8 · ( 2 4 + 1 - ( 2 4 - 1 ) · Q 4 ) ( mod p ); 2 1 z1 ≡ ⋅ Q k +1 ⋅ (2 2 k +1 + 1 − (2 2 k +1 − 1) ⋅ Q 2 k +1 ) ( mod p ); 2 z 2 = p – z1 z 2 = p – z1 In questo caso l‘algoritmo della esponenziazione modulare, sarà usato più volte. Anche per un primo p della forma 4k +1 esiste una formula [Cip] per il valore risolutivo di z, previo il calcolo di un qualsiasi non residuo quadratico di p. Per la sua espressione si rimanda a [Cip],Dic]. E’ però da chiarire che l’impiego di tale formula riportata comunque qui di seguito risulta conveniente solo se, posto p sotto la forma p = h· 2 r + 1, l’esponente r è di valore non grande: p −1+ 2 r z ≡ Q 2 r +1 2 r−2 s ( p −1) ⋅ 2 r −1 ∑ −1 s=0 Q 2 r (mod p) ( 2 s + 1 )( p − 1 ) nr 2 r r − 1 dove nr è un qualsiasi non residuo quadratico di p e 2 è la massima potenza di 2 che divide p – 1 2 In questo articolo si vuole mostrare un algoritmo che si basa sull’utilizzo delle Sequenze di Lucas per la risoluzione della congruenza z 2 ≡ Q (mod p) con p primo di qualsiasi forma . Prima però di entrare in merito all’algoritmo è opportuno dare qualche cenno nei riguardi di queste sequenze. Sequenze di Lucas [Rie], [Rib], [SI3] Detti P, Q due numeri interi diversi da zero si consideri la forma quadratica x 2 + P·x + Q = 0 che prende il nome di equazione caratteristica: il suo discriminante è D = P 2 − 4Q Si prendano in esame due successioni o sequenze di numeri interi, una il cui termine generico sarà indicato con U(k), l’altra con il termine generico V(k), dove k = 0,1,2 3 ….. è l’indice che individua la posizione dei numeri U e V nella successione. I primi due termini relativi alla sequenza dei numeri U(k) siano U(0) = 0, U(1) = 1 e per la sequenza dei numeri V(k), V(0) = 2, V(1) = P inoltre per ogni k ≥ 2 si ponga: U(k) = P·U(k -1) – Q·U(k-2) (1) V(k) = P·V(k -1) – Q·V(k-2) (2) La sequenza dei numeri V(k) prende il nome di sequenza associata (companion) a quella dei numeri U(k). In un precedente articolo dedicato tali tipi di sequenze [Teo] si era accennato a queste sequenze numeriche; allora si erano illustrate solo due particolari sequenze tra loro associate e precisamente la successione dei Numeri di Fibonacci e la successione dei Numeri di Lucas che si ottengono con le regole generali indicate sopra e ponendo P = 1 e Q = –1. Qui nell’utilizzo delle sequenze di Lucas per trovare le soluzioni della congruenza z 2 ≡ Q (mod p) se esistono, dobbiamo considerarle in modo più generale, vale a dire con il termine noto qualsiasi Q della congruenza pari al valore Q dell’equazione caratteristica e con un opportuno P che può avere valore diverso da 1 e del quale parleremo più avanti. Algoritmo per la risoluzione di z 2 ≡ Q (mod p) La possibilità di impiegare le sequenze di Lucas per risolvere la congruenza si basa su quanto segue [Rie], [Rob]: “Data la congruenza z 2 ≡ Q (mod p), se essa è risolubile, prese in considerazione le due sequenze di Lucas U(k) e V(k) derivate dall’equazione caratteristica x 2 + P·x + QL = 0 con QL = Q e P scelto in modo che P 2 – 4·Q sia un non residuo quadratico di p, si dimostra che i valori ± con indice k = p +1 sono le soluzioni cercate della congruenza. 2 V (k ) (mod p) 2 Per quanto riguarda i valori U(k) si trova che per tale indice il valore U(k) risulta congruo a 0 (mod p), cioè U(k) ≡ 0 (mod p) .” La condizione che il valore U(k) ≡ 0 (mod p) può essere presa come prova,non assoluta comunque, che i valori trovati ± V (k ) (mod p) 2 con indice k = p +1 , sono effettivamente validi. 2 Vediamo ora quali sono i diversi passi con cui procedere per poter risolvere efficacemente la congruenza: a) – prima di introdurre il numero p si deve controllare che esso sia effettivamente un numero primo; b) – si deve verificare che q e p , qualora sia q > 2p, siano primi fra loro; c) – si deve appurare quindi che la congruenza ammette soluzioni: si dimostra [Tch],[Cip],[Hur] che essa ha due soluzioni z1 e z 2 = p – z1 , se Q è residuo quadratico di p, vale a dire se Q se Q risulta un non residuo quadratico di p, cioè se Q la ricerca ha termine. 3 p −1 2 p −1 2 ≡ +1 (mod p); ≡ –1 (mod p) la congruenza non ha soluzioni e La verifica che il numero Q sia residuo quadratico o meno di p viene effettuata calcolando il simbolo di Jacobi [Cip], [Tch], [SI1], [SI2], che in questo caso essendo p primo, coincide con il simbolo di Legendre, p −1 ⎛Q⎞ ⎛Q⎞ ⎛Q⎞ ed è indicato come segue : ⎜⎜ ⎟⎟ . Si ha pertanto ⎜⎜ ⎟⎟ = Q 2 (mod p) e quindi: se ⎜⎜ ⎟⎟ ≡ +1 Q è ⎝ p⎠ ⎝ p⎠ ⎝ p⎠ ⎛Q⎞ residuo quadratico di p ; se ⎜⎜ ⎟⎟ ≡ –1 Q è non residuo quadratico di p. ⎝ p⎠ 2 d) – si deve poi trovare un opportuno minimo valore di P tale per cui D = P ⎛D⎞ residuo quadratico di p, cioè ⎜⎜ ⎟⎟ ≡ –1 (mod p). ⎝ p⎠ – 4·Q sia un non e) – effettuati questi calcoli occorre trovare un valido algoritmo per calcolare il valore ± V (k ) (mod p) 2 p +1 utilizzando però formule diverse dalle (1) e (2) in quanto con esse si dovrebbero calcolare 2 p +1 ) il che, come già appurato nell’articolo citato, tutti i valori di U e di V precedenti il valore V ( 2 dove k = allungherebbe di molto il tempo di esecuzione. Il programma scritto in linguaggio Qbasic riportato nell’Allegato 1 comprende i vari punti sotto elencati, ad esclusione del punto a), ciascuno dedicato a sviluppare algoritmi preposti a risolverli . Si elencano qui di seguito i diversi algoritmi che devono essere preventivamente utilizzati nel programma prima di arrivare a quello di cui al punto e). Punto a) - è opportuno controllare preventivamente che il numero p sia effettivamente primo: solo se p è primo si procederà ad introdurlo; si prosegue quindi nella costruzione dell’algoritmo per soddisfare quanto richiesto al punto b). Punto b) - per verificare che il termine noto Q ed il modulo p siano primi tra loro si controlla che il loro Massimo Comun Divisore (mcd) abbia valore 1. Si può però evitare il calcolo del (mcd ), anche se non oneroso, osservando che nell’effettuare al punto c) il calcolo del simbolo di Jacobi., se si trovasse per tale simbolo il valore 0 (zero), ciò indicherebbe che i numeri Q e p non sono primi fra loro. ⎛Q⎞ ⎟⎟ non conviene procedere con il metodo ovvio ⎝ p⎠ Punto c) - per trovare il valore del simbolo di Jacobi: ⎜⎜ p −1 2 (mod p), ma con un algoritmo alternativo che di esponenziazione modulare per calcolare il valore Q consente di arrivare al risultato molto più velocemente. Questo algoritmo si basa sulle cinque seguenti proprietà e relazioni: c1), c2), c3), c4) c5), attinenti il simbolo di Jacobi [Cip], [SI1,[SI2]: ⎛Q⎞ c1: ⎜⎜ ⎟⎟ = (-1 ) ⎝ p⎠ ⎛Q⎞ ⎛ r ⎞ c3 : ⎜⎜ ⎟⎟ = ⎜⎜ ⎟⎟ ⎝ p⎠ ⎝ p⎠ Q −1 p −1 2 2 ⎛ p⎞ ⎜⎜ ⎟⎟ ⎝Q⎠ se Q ≡ r ( mod p) ⎛2⎞ c2: ⎜⎜ ⎟⎟ = (-1) ⎝ p⎠ ⎛1⎞ c4: ⎜⎜ ⎟⎟ = 1 ⎝ p⎠ p 2 −1 8 ⎛ −1⎞ ⎟⎟ = (-1 ) c5: ⎜⎜ ⎝ p⎠ p −1 2 Punto d) - per la ricerca dell’ appropriato minimo valore di P si sfrutta lo stesso algoritmo di cui al punto c) aggiungendo tuttavia nel programma da realizzare opportune istruzioni per tenere conto che occorrerà ricercare il valore di P tramite anche diverse iterazioni da effettuarsi sull’algoritmo stesso. Punto e) - Oggetto principale del presente articolo è quello di illustrare un algoritmo atto al calcolo rapido di un qualsiasi valore V(k) (mod p) della sequenza di Lucas, relativa ai suddetti valori di Q e di P. In particolare si deve predisporre un efficiente algoritmo relativo al calcolo di ± 4 V (k ) (mod p) per un indice 2 k= p +1 . Non essendo opportuno, come già accennato, ricorrere all’uso delle relazioni (1) e (2) è necessario 2 rivolgere l’attenzione ad altre formule relative ai termini U(k) e V(k) . Sussistono in effetti le seguenti relazioni [Rib] [SI3] tra i valori delle due sequenze : U(2·k) = U (k)·V(k) (3) V(2·k) = V(k) 2 – 2·Q k (4) 2·U(2·k+1) = U(2·k)·V(1) + V(2k)·U(1) (5) 2·V(2·k+1) = V(2·k)·V(1) +D·U(2·k)·U(1) (6) dove con k si intende il generico indice. Poiché U(1) = 1 e V(1) = P , tenendo conto delle relazioni (3) e (4, le due relazioni (5) e (6) si possono scrivere come segue: 2·U(2·k+1) = P · U (k) · V(k) + V(k) 2 – 2·Q k (7) 2·V(2·k+1) = P · V(k) 2 + D · U (k) · V(k) – 2·P·Q k (8) dove, ricordiamo, D =P 2 – 4·Q. Dalle suddette relazioni si constata che valori di U(k) e V(k) ricavati dalle (3) e (4) relativi ad un generico indice pari 2·k , e dalle (7) e (8) relativi ad un generico indice dispari 2·k +1 dipendono unicamente dall’indice k e dai valori assunti da U e da V relativi a tale indice k. Dall’attenta osservazione dei valori degli indici riportati nelle suddette formule il calcolo dei valori U( k s ) e V( k s ) di un indice prefissato k s può essere eseguito con efficacia, previa la realizzazione adeguata e limitata successione di indici k costruita con le seguenti regole: 1) partendo dall’indice di una k s che interessa, il successivo indice da trovare è il seguente: ks k −1 se k s è di valore pari; k s −1 = s se k s è di valore dispari 2 2 2) gli ulteriori indici k s − 2 , k s −3 ,…………, k 2 , k1 , k 0 della successione si trovano applicando a ciascuno di k s −1 = loro l’operazione del tipo di cui al punto 1). Si noti che tali indici assumono valori sempre più piccoli fino ad arrivare all’indice k 0 di valore 1. Così operando si arriverà ad individuare tutti i valori numerici degli indici della successione sino all’ultimo k 0 che ha valore 1, qualsiasi sia il valore dell’indice k s di partenza. E’ facile vedere poi che la successione degli indici da trovare , non considerando pertanto l’indice k s che è ⎢ Log (k s ) ⎥ ⎥ indici . ⎣ Log 2 ⎦ noto, è costituita solo da s = ⎢ Una volta ottenuta e opportunamente memorizzata tale successione di indici si devono considerare le formule (3), (4), (7) e (8), le quali prendendo in considerazione la successione degli indici, possono essere scritte più opportunamente nel seguente modo, mettendo così in evidenza la loro natura (essenza ) iterativa : U (k i ) = U (k i −1 ) · V(k i −1 ) (3b) V (k i ) = V(k i −1 ) 2 – 2 · Q ki −1 (4b) 2 · U (k i ) = P · U (k i −1 ) · V(k i −1 ) + V(k i −1 ) 2 – 2 · Q ki −1 2 · V (k i ) = P · V(k i −1 ) 2 + D ·U (k i −1 ) · V(k i −1 ) – 2 · P · Q (7b) ki −1 (8b) Si osservi che dette formule danno luogo ad un calcolo di tipo iterativo: il calcolo di U(k i ) e di V(k i ) può essere effettuato infatti con i valori di U(k i −1 ) e di V(k i −1 ) trovati nell’iterazione precedente, col valore dell’indice k i anch’esso già trovato e con termine noto Q, e dei valori P e D già calcolati. 5 Si dovranno poi prendere in considerazione le formule (3b ) e (4b) se l’indice k i è di valore pari, utilizzare invece le formule (7b) e(8b) se esso è di valore dispari. Si può arrivare così al calcolo di U( k s ) e ⎢ Log (k s ) ⎥ ⎥ iterazioni utilizzando gli indici trovati e ⎣ Log 2 ⎦ di V( k s ) attraverso un ciclo limitato di s = ⎢ opportunamente memorizzati della successione. E’ importante sottolineare che tutti i calcoli da effettuare sulle suddette formule sono da eseguirsi modulo p. Ciò significa, che ogni risultato R di una qualsiasi operazione aritmetica, qualora superi il valore p , non può essere utilizzato come tale per una ulteriore operazione aritmetica: al suo posto nel proseguimento dei calcoli deve essere utilizzato il resto r ottenuto dalla divisione di R per p. Tutto ciò viene indicato dicendo che le operazione aritmetiche sono effettuate “(mod p)” ed il valore r prende il nome di residuo modulo p di R. Nel nostro caso per trovare l’opportuna successione di indici di valore numerico decrescente si deve partire dall’indice k s = p +1 . 2 Avendo a disposizione la successione desiderata degli indici perché preventivamente memorizzata, si parta ora dall’indice k 0 = 1 e dai valori conosciuti di U(k 0 ) =1 e di V(k 0 ) = P : risalendo poi passo passo tenendo conto dei particolari indici trovati della successione di valore sempre più grande, si è in grado di calcolare con le formule a disposizione i valori di U(k i ) e di V(k i ) relativi all’indice k i utilizzando unicamente i valori di U(k i −1 ), di V(k i −1 ) e dell’indice k i −1 , oltre naturalmente i valori del coefficiente noto Q e dei valori di P e D. Il calcolo di U(k i ) e di V(k i ) potrà quindi essere effettuato con i valori di U(k i −1 ) e di V(k i −1 ) già trovati nell’iterazione precedente, dell’indice k i preventivamente calcolato e dei termini noti Q, P e D. Si dovranno poi prendere , come già detto, in considerazione le formule (3b) e (4b) se l’indice k i è di valore pari, si dovranno invece utilizzare le formule (7b) e(8b) se esso è di valore dispari. ⎢ Logk s ⎥ p +1 con k s = partendo ⎥ 2 ⎣ Log 2 ⎦ Pertanto attraverso il calcolo di un numero limitato di iterazioni pari a ⎢ dall’indice k 0 = 1 si possono trovare i valori di U( k s ) e di V( k s ) desiderati. Esempio Vediamo di chiarire meglio tutto quanto finora esposto con un esempio molto semplice ma significativo. I risultati qui esposti sono stati trovati con il programma il cui listato è riportato in Allegato 1 del presente articolo. Si voglia risolvere la semplice congruenza z 2 ≡ – 47 (mod 1427) dove Q = – 47 e p = 1427. Si sia già verificato che il numero 1427 è primo per cui q e p sono primi fra loro essendo q < p. Si deve vedere ora se la congruenza è risolubile o meno calcolando il valore del simbolo di Jacobi: ⎛Q⎞ ⎛ − 47 ⎞ ⎜⎜ ⎟⎟ = ⎜ ⎟ ⎝ 1427 ⎠ ⎝ p⎠ p −1 2 1427−1 2 = 10 (mod 1427) con l’algoritmo Più che effettuare il calcolo diretto cercando il valore assunto da Q di esponenziazione modulare, è conveniente utilizzare un algoritmo che utilizzi le formule c1, c2 ,c3, c4 e c5 sopra riportate con le quali si può realizzare un più efficiente e veloce algoritmo di calcolo. Ad esempio con i presenti valori, impiegando il primo algoritmo sono necessarie 9 iterazioni, con il secondo sono necessarie solo 4 iterazioni. In generale l’uso del secondo algoritmo è tanto più conveniente quanto più grandi sono i valori di p. Se il ⎛Q⎞ ⎟⎟ è –1 la congruenza non è risolubile e quindi la ricerca termina. Tornando alla congruenza ⎝ p⎠ valore di ⎜⎜ ⎛ − 47 ⎞ ⎟ si ottiene per esso un valore + 1 per cui ⎝ 1427 ⎠ z 2 ≡ – 47 (mod 1427) ed al relativo Simbolo di Jacobi = ⎜ è lecito proseguire nella risoluzione della congruenza. 6 Proseguendo si deve trovare ora il minimo valore di P tale per cui D = P 2 – 4Q sia un non residuo quadratico di P. Partendo con un valore di P = 1 si prosegue eventualmente con P =2, 3 ,4 …. ⎛ P − 4Q ⎞ ⎟⎟ risulta = –1. ⎝ p ⎠ Ci si ferma nella ricerca allorché il simbolo di Jacobi ⎜⎜ Utilizzando pertanto lo stesso algoritmo usato per il calcolo del simbolo di Jacobi, partendo da un valore P = 1, dopo un numero limitato di iterazioni (in questo esempio bastano 3 iterazioni) si trova che per P = 3 e quindi per D = 3 2 – 4· (– 47) = 197 ⎛ 197 ⎞ ⎟ vale –1. Applicando quanto ⎝ 1427 ⎠ il simbolo di Jacobi ⎜ richiesto al punto e ) le formule (3bis) (4bis), (7bis) e (8bis) con i valori diventano per questo esempio le seguenti : U(k i ) = U (k i −1 )·V(k i −1 ) V(k i ) = V(k i −1 ) 2 – 2·(- 47) Q = – 47 , P = 3 e D = 197 (3b) ki −1 2·U(k i ) = 3·U (k i −1 )·V(k i −1 ) + V(k i −1 ) 2 – 2·(- 47) (4b) ki −1 (7b) k (8b) 2·V(k i ) = 3·V(k i −1 ) 2 + 197·U (k i −1 )·V(k i −1 ) – 2·3·(- 47) i −1 tramite le quali con un ciclo iterativo di operazioni (modulo p) si deve calcolare il valore di V (k s ) ⎢ Log (k s ) ⎥ p +1 (mod p) per k s = dove p = 1427. Il numero di iterazioni sarà pari a ⎢ ⎥ =9 2 2 ⎣ Log 2 ⎦ ⎛ 1427 + 1 ⎞ ⎟ = V (714) 2 ⎠ ⎝ Vediamo ora di trovare la successione di indici k per arrivare al calcolo di V ⎜ Innanzitutto la successione, incluso l’indice iniziale noto k s = 714 sino all’ indice k 0 = 1, è composta ⎢ Log 714 ⎥ 1427 + 1 = 9. Con le regole citate, partendo da k s = k 9 = = 714 si ⎥ 2 ⎣ Log 2 ⎦ possono calcolare gli altri valori decrescenti dei successivi indici k: poiché k s è pari , si ottiene k s −1 = 714 357 − 1 = k8 = = 357, che essendo dispari darà luogo a sua volta ad un indice k s − 2 = k 7 di valore = 2 2 178 = 178. Questo indice di valore pari darà luogo all’indice k s −3 = k 6 = = 89 ; proseguendo con il 2 da s +1 indici dove s = ⎢ calcolo dei successivi indici si otterranno i seguenti valori : k5 = 89 − 1 44 22 11 − 1 5 −1 2 = 44; k 4 = = 22; k 3 = = 11; k 2 = = 5 ; k1 = = 2 ; k0= =1 2 2 2 2 2 2 si ha pertanto seguente successione limitata di indici di valore numerico decrescente sia pari che dispari: k 9 = 714 k 8 = 357 k 7 = 178 k6 = 89 k5 = 44 k4 = 22 k3 = 11 k2 = 5 k1 = 2 k0 = 1 7 Sempre per l’esempio riportato si può costituire così la seguente tabella esplicativa: iterazione Passaggio indici Formule d a k i −1 a a k0 = 1 Æ k1 = 2 a k1 = 2 Æ k2 = 3 a k2 = 5 4 a k3 = 11 5 a k4 = 22 Æ 6 a k5= 7 a k6 = 8 9 1 ki U (k i −1 ) Æ U (k i ) V(k i −1 ) Æ V (k i ) da usare 2 (3b) e (4b) U(1) Æ U(2) V(1) Æ V(2) 5 (7b) e (8b) U(2) Æ U(5) V (2) Æ V(5) Æ k 3 = 11 (7b) e (8b) U(5) Æ U(11) V (5) Æ V(11) Æ k4 = 22 (3b) e (4b) U(11) Æ U (22) V(11) Æ V(22) k5 = 44 (3b) e (4b) U(22) Æ U (44) V22) Æ V(44) 44 Æ k6 = 89 (7b) e (8b) U(44) Æ U (89) V(44) Æ V(89) 89 Æ k 7 = 178 (3b) e (4b) U(89) Æ U (178) V(89) Æ V(178) a k 7 = 178 Æ k 8 = 357 (7b) e (8b) U(178) Æ U (357) V(178) Æ V(357) a k 8 = 357 Æ k 9 = 714 (3b) e (4b) U(357) Æ U (714) V(357) Æ V(714) Si ribadisce ancora una volta che tutti i calcoli per trovare valori di U e di V sono da effettuare in aritmetica modulo p (mod p). Ciò comporta che tutti i valori numerici dei diversi U(k) e V(k) trovati non saranno mai superiori a p. Per il calcolo dell’operazione di elevazione a potenza Q k (mod p) che compare nelle formule si può fare ricorso all’ algoritmo della esponenziazione modulare. Osservando però la particolare successione di indici ottenuti si può evitare tale tipo di algoritmo che, pur efficiente, allungherebbe sia il numero di istruzioni nel programma sia anche i tempi do calcolo rispetto ad un algoritmo basato sostanzialmente sulla seguente considerazione: si osservi che passando da una iterazione a quella successiva Q ki Q ki risulta essere pari a (Q ) (Q ) k i −1 2 k i −1 2 se l’indice k i −1 è un numero pari risulta essere pari a · Q se l’indice k i −1 è un numero dispari Naturalmente i suddetti valori devono essere sempre calcolati (mod p ). Per completezza si riportano qui di seguito partendo dai valori iniziali di U e di V i successivi valori numerici di U e di V trovati in ciascuna iterazione (it.): valori iniziali: U = 1 V = P=3 a = 3 V(2) = 103 1 it.: U(2) a 2 it.: U(5) = 705 V(5) = 1194 a V(11) = 581 3 it.: U(11) = 926 a 4 it.: U(22) = 27 V(22) = 1218 5 a it.: U(44) = 65 V(44) = 892 V(89) = 726 6 a it.: U(89) = 582 a 7 it.: U(178) = 140 V(178) = 597 a 8 it.: U(357) = 0 V(357) = 885 a V(714) = 1328 9 it.: U(714) = 0 ⎛ p +1⎞ ⎛ 1427 + 1 ⎞ ⎟ = V⎜ ⎟= = = = 2 ⎠ ⎝ 2 ⎠ ⎝ V (714) 1328 = = = V(714) = 1328 che diviso per 2 da luogo ad una delle soluzioni della congruenza : z1 = 2 2 = 664. L’altro valore della congruenza è immediato: z 2 = – 664 ≡ p – z1 = 763. Si noti il valore 0 di U (714) . È il caso di ricordare ancora una volta che tutti i valori numerici sono calcolati (mod p). 2 il risultato V(714) = 1328 della 9 a e ultima iterazione è il valore cercato V ⎜ 8 Risoluzione della Congruenza z 2 ≡ Q (mod p) con valori di Q e p grandi E’ necessario a questo punto precisare quanto segue: un calcolo per la congruenza relativa ad un modulo p piccolo come quello dell’esempio sopra illustrato (p = 1427), potrebbe essere sviluppato anche più opportunamente con un programma di calcolo con l’algoritmo di tipo esaustivo composto da poche istruzioni formanti un ciclo di operazioni ripetuto al massimo p . 2 Ciò è vero per moduli p abbastanza piccoli, ma si può già constatare che nel risolvere una congruenza il cui modulo p sia un primo costituito da solo 8 cifre, la differenza dei tempi di calcolo comincia a farsi sentire. Ad esempio risolvendo la seguente congruenza z 2 ≡ 3 (mod 85225897) su di uno stesso calcolatore e con l’utilizzo di un medesimo linguaggio (Qbasic) si sono ottenuti i seguenti tempi di risoluzione: - con algoritmo esaustivo: un tempo di 31 secondi - con algoritmo illustrato: un tempo praticamente immediato. Il calcolo in questo caso è stato effettuato tramite l’esecuzione di un programma realizzato e scritto in linguaggio Qbasic relativo alla risoluzione di una qualsiasi congruenza quadratica avente valori di Q e di p non grandi, tali cioè di poter risolvere la congruenza in modo esatto con l’utilizzo della sola aritmetica in doppia precisione disponibile sul nel software utilizzato. Pertanto nel nostre caso occorre che Q sia composto da non più di 15 cifre e p da non più di 7 cifre. Il listato del programma è riportato nell’ Allegato 1. Per moduli p anche non eccessivamente grandi, costituiti da appena 16 cifre si è potuto constatare tramite apposito programma a precisione multipla che, mentre il tempo impiegato per conoscere se la congruenza è risolubile e in tal caso calcolarne le soluzioni è praticamente immediato, con un programma esaustivo, naturalmente estrapolando i tempi ottenuti per moduli p piccoli ( p con: 7 cifre e 8 cifre). il tempo di calcolo sarebbe maggiore ai 10 anni. Per moduli p con 20 cifre si potrebbe avere addirittura un tempo di verifica e calcolo superiore ai 50 mila anni. Che sia importante realizzare un algoritmo e di conseguenza un programma con cui risolvere in tempi brevi le congruenze con valori per Q per p grandi risulta evidente non solo da un punto di vista euristico ma anche quando si deve effettuare la scomposizione in fattori di un numero composto grande. Infatti in uno dei più moderni ed efficienti metodi di fattorizzazione di numeri grandi, vale a dire il metodo del “Crivello Quadratico” (Quadratic Sieve), è indispensabile risolvere preliminarmente diverse congruenze quadratiche anche con moduli primi di discrete dimensioni [Kob], [Bre], [SI4, [SI5], [SI6]. Inoltre pure nel il campo della crittografia risulta necessario poter risolvere questo tipo di congruenza (vedi più avanti il paragrafo delle applicazioni tecniche). Pertanto si è realizzato un ulteriore programma sempre in linguaggio Qbasic, dedicato a valori per p e per Q che possono avere valori grandi composti ciascuno anche da diverse decine di cifre. In effetti esso è atto a risolvere una qualsiasi congruenza quadratica avente termine noto Q sia positivo che negativo costituito sino a qualche centinaia di cifre, e con modulo p primo “limitato”, composto al massimo da 125 cifre. Questo limite è determinato dall’aver utilizzato nelle istruzioni un solo array bidimensionale (una matrice può essere composta al massimo da 8000 elementi nel software Qbasic) per incamerare e memorizzare tutti gli appositi indici k (da k s = p +1 a k 0 = 1), trovati con le regole sopraesposte, relativi ai valori U(k) e V(k). 2 In tale programma non essendo sufficienti i calcoli in doppia precisione relativi a tutte le operazioni aritmetiche presenti nel listato del programma mostrato in Allegato 1, le analoghe operazioni aritmetiche vengono effettuate, compresa la divisione, in aritmetica a precisione multipla. Ciò comporta l’esattezza di tutti i calcoli su numeri grandi e sui risultati ottenuti a scapito però di una più onerosa realizzazione del programma, dato il grande numero di istruzioni e la loro maggiore complessità necessarie all’esecuzione delle varie operazioni aritmetiche. Non si è ritenuto opportuno allegare al presente articolo, per non appesantirlo troppo, il listato del suddetto programma data la sua non indifferente lunghezza. In una Tabella sotto riportata sono illustrati comunque alcuni risultati di esempi di risoluzione relativi a congruenze quadratiche ottenuti utilizzando il programma suddetto. Nella penultima colonna della tabella è mostrato il tempo di calcolo richiesto con l’algoritmo illustrato: Tal; nell’ultima colonna è mostrato invece il tempo di calcolo necessario con l’algoritmo di tipo esaustivo: Tes; i valori con * sono dedotti ovviamente per estrapolazione dai tempi ottenuti per moduli p di 7 e di 8 cifre. Si noti che è impensabile intraprendere un calcolo esaustivo per risolvere qualsiasi congruenza quadratica avente per modulo un primo p anche di solo 16 cifre. Per una più facile lettura dei valori numerici, essi sono stati separati in gruppi di 7 cifre decimali come del resto calcolati nel programma, avendo utilizzato per le 9 operazioni aritmetiche la Base (Radix) 10 7 di numerazione anziché la normale Base 101 . Si fa osservare che ad un gruppo di 7 cifre in base 10 si fa corrispondere una singola cifra in aritmetica in Base 10 7 . Considerazioni sulla congruenza z 2 ≡ Q (mod n ) con n composto Finora si sono considerate congruenze aventi come moduli numeri primi p. Per diversi algoritmi crittografici occorre trovare i valori che soddisfano una congruenza del tipo z 2 ≡ Q (mod n ) con n composto dal prodotto di due numeri primi, cioè n = p1 ⋅ p 2 con p1 e p 2 numeri primi grandi costituiti ciascuno anche da più di 150 cifre decimali.. Cosa si può dire riguardo ad un tale tipo di congruenza quadratica? In generale la risoluzione di una congruenza quadratica con modulo composto presenta le stesse difficoltà del problema della fattorizzazione di un numero in quanto il primo passo per la sua eventuale risoluzione è quello di scomporre in fattori il modulo n. In questo specifico caso però si supponga di conoscere a priori i fattori p1 e p 2 che compongono il modulo. Si supponga anche che n e Q siano primi tra loro, cioè che si abbia (Q , n) = 1, dove con tale simbologia viene indicato il Massimo Comun Divisore fra Q ed n.. Condizione indispensabile perché la congruenza z 2 ≡ Q (mod p1 ⋅ p 2 ) sia risolubile, è che siano risolubili entrambe le due seguenti congruenze z 2 ≡ Q (mod p1 ) e z 2 ≡ Q (mod p 2 ). In effetti se anche una sola delle due congruenze non risulta risolubile anche la congruenza con modulo n = p1 ⋅ p 2 non lo è [Tch], [Nag] . Una volta risolte le due congruenze quadratiche rispettivamente con modulo p1 e modulo p 2 , ciascuna delle quali presenterà due valori numerici che la soddisfano, si. avranno disponibili 4 congruenze lineari: z ≡ z11 (mod p1 ), z ≡ z12 (mod p1 ) relative alla congruenza con modulo p1 z ≡ z 21 (mod p 2 ), z ≡ z 22 (mod p 2 ) relative alla congruenza con modulo p 2 con le quali si possono formare 2 2 distinti sistemi di congruenze, composti ciascuno da 2 congruenze lineari.Si tenga presente che in uno qualsiasi di questi 4 sistemi non devono mai comparire due congruenze lineari i cui termini noti siano le soluzioni di una stessa congruenza quadratica. E’ ben noto che per trovare una soluzione atta a soddisfare un insieme di congruenze lineari bisogna far ricorso al Teorema cinese dei resti. Per detto teorema si può fare riferimento ad una vasta bibliografia di cui si riportano solo alcuni riferimenti [Bar], [Niv], [Wag], relativi anche ad indirizzi di Siti Internet [SI4],.[SI5]. Questo teorema ci assicura che dato un insieme di congruenze lineari se i vari moduli delle congruenze sono relativamente primi fra loro, esiste un valore comune tale da soddisfare simultaneamente ognuna della congruenze. Utilizzandolo, nel nostro caso avremo che un generico valore dei 4 valori di z 2 ≡ Q (mod n ) che la soddisfano può essere trovato tramite la seguente formula: n n + z 2 i · b2 · con i = 1,2 p1 p2 n · bi ≡ 1 ( mod pi ) dove ogni bi si ricava risolvendo la congruenza lineare pi z n = z1i · b1 · Alcune applicazioni tecniche Vi sono delle interessanti applicazioni tecniche in cui vengono implicati e utilizzati argomenti trattati nel presente articolo specie nel campo delle telecomunicazioni e della crittografia. Ci limiteremo ad elencare qui alcune di quelli indicati in [Shr] e in [Schn]. Per i residui quadratici: - Applicazione di successioni di residui quadratici nella progettazione riguardante un’ampia diffusione di onde sonore negli ambienti per migliorare la qualità acustica. - Possibili applicazioni nella copertura radar e sonar nella riduzione del rumore. - Applicazione per la riduzione delle interferenze, in particolare riguardo al “jamming” nelle comunicazioni 10 via radio in cui è raccomandato l’uso di larghi spettri; in effetti nell’utilizzo di una stessa banda di frequenze fra più utenti si può dimostrare che l’attribuzione di particolari successioni di residui quadratici da assegnare ad ognuno di loro permette di ridurre al minimo le interferenze fra le varie trasmissioni, pur essendo esse contemporanee. Per le congruenze quadratiche: Oltre al loro già summenzionato utilizzo in uno dei più efficienti metodi di scomposizione in fattori di numeri grandi (Quadratic Sieve Method) altre applicazioni riguardano soprattutto il campo della crittografia abbinata al campo delle telecomunicazioni quali ad esempio: – il metodo crittografico di Rabin [Schn] : vedi riquadro – il metodo di Ong – Shnorr- Shamir [Schn] relativo alla firma digitale; – il metodo di zero – knowledge di Feige- Fiat - Shamir [Schn] dedicato all’’autenticazione della firma digitale. Per le Sequenze di Lucas: vi sono applicazioni che interessano sia crittosistemi a chiave pubblica, come ad esempio il “LUC Public Key Encription”) valido quanto il crittosistema RSA, sia test di primalità. Riguardo a quest’ultimo argomento è da mettere in evidenza infatti che la ricerca e l’individuazione dei più grandi numeri primi finora scoperti si è potuta realizzare grazie proprio all’impiego di dette sequenze. METODO di RABIN Il messaggio grandi primi M viene crittografato secondo la relazione C ≡ M 2 ( mod N ) dove N è un numero composto dal prodotto di due p1 e p 2 , ciascuno costituito da parecchie decine di cifre; in ricezione l’utente la cui chiave pubblica è il numero N, quando riceve il messaggio criptato C è l’unico a poterlo decifrare utilizzando le sue due chiavi segrete disporre di un algoritmo veloce ed efficace per decrittare il messaggio secondo la relazione 2 z 2 p1 e p 2 . Esso però deve ≡ C ( mod N ) la cui risoluzione 2 può essere effettuata solo risolvendo prima le due congruenze z ≡ C (mod p1 ) e z ≡ C (mod p 2 ); quindi, col ricorso del Teorema dei Resti Cinese risolvendo il sistema di due congruenze lineari impieganti le soluzioni delle suddette congruenze. Si 2 dimostra infatti che uno dei quattro valori di z trovati che soddisfano la congruenza z ≡ C ( mod N ) risulta essere il messaggio originale M. E’ da osservare però che sussiste l’ambiguità della scelta del messaggio effettivo fra i quattro valori di z . Se il messaggio originale è un normale testo in italiano (o comunque in un’altra lingua) allora sarà facile scegliere fra i quattro valori di z quello corretto. In generale sussiste la suddetta ambiguità . ----------------------------------------------------------------------------Un possibile metodo, comunque non molto efficiente, per ovviare a ciò potrebbe essere il seguente: l’utente a cui è destinato il messaggio mette a disposizione due chiavi pubbliche, numeri primi p1 , p 2 , p3 e N 1 = p1 · p 2 e N 2 = p3 · p 4 , avendo come sue p 4 . Esso riceverà pertanto due messaggi criptati C1 2 ≡M 2 (mod N1 ) chiavi segrete i quattro e C2 ≡ M2 (mod 2 che decritterà risolvendo le due congruenze quadratiche z ≡ C1 (mod N 1 ) e z ≡ C 2 (mod N 2 ). Si avranno così disponibili quattro valori risolutivi per la prima congruenza ed altri quattro per la seconda. Osservando queste otto soluzioni solo due in generale saranno identiche, una estratta fra le quattro della prima congruenza , l’altra estratta dalle altre quattro relative alla seconda congruenza. Sarà pertanto questa soluzione comune il messaggio originale M. N2 ) . Nota sui residui Occorre tener conto che sui residui ottenuti si possono effettuare, se necessarie, le seguenti operazioni, lecite in aritmetica modulare : 1 ) se rn < 0 è il residuo negativo (mod p ) di un valore numerico negativo –R , i molti casi risulta preferibile sostituire questo valore negativo rn con l’equivalente (più prossimo a 0) residuo rp positivo ( mod p) di –R che risulta essere rp = p - |rn| . Tale sostituzione risulta indispensabile allorché si devono effettuare i calcoli in aritmetica a precisione multipla su grandi valori numerici, non sono trattabili neanche con l’aritmetica la doppia precisione disponibile sul calcolatore nel linguaggio utilizzato; 2) detto rd il residuo dispari di R ( mod p) per ottenere un intero quale residuo di rd /2 si calcola il valore rd + p che sarà senz’altro intero essendo p>2 dispari. 2 Questa operazione deve essere effettuata ad esempio quando nelle formule (7) e (8) utilizzate per il calcolo del residuo di 2·U(2k+1) e di 2·V(2k+1) il risultato dei calcoli (mod p) è un numero dispari dovendo trovare invece il residuo di U(2k+1) o di V(2k+1). 11 RIFERIMENTI [Bar] - G.C. Barozzi, Aritmetica un approccio computazionale, Zanichelli, Bologna 1991 [Bre] - D.M.Bressoud, Factorization and Primality Testing, Springer-Verlag, New York 1989 [Cip] - M.Cipolla, , Teoria dei numeri, Analisi Indeterminata in Enciclopedia delle Matematiche Elementari, vol.I, parte I, Cap. IV – Parte seconda - U. Hoepli editore, Milano [Dic] - L .E. Dickson – History of the Theory of Numbers , Vol. I , Chap.VII - Chelsea Publishing Company , New York , 1992 [Eul] - L. Euler, Elémens d’Algèbre –Tome second, Analise Indeterminée, Bachelier, Librairie pour le Mathématiques, Paris 1807 [Hur] - A. Hurwitz – N. Kritikos, Lectures on Number Theory, Springer-Verlag, New York 1986 [Kob] - N. Kobliz, A Course in Number Theory and Criptography, Springer-Verlag, New York 1994 [Kra] - E.Kranakis, Primality and Cryptography, J.Wiley & Sons 1986 [Lan] - E. Landau, Elementary Number Theory, Chelsea Publishing Company, New York, 1966 Nag] - T. Nagell, Introduction to Number Theory, Chelsea Publishing Company, New York, 1981 [Niv] - I. Niven - H.S.Zuckerman, An Introduction to the Theory of Numbers, J.Wiley & Sons 1980 [Old] - C.D. Olds, Frazioni continue, Collana di Matematica Moderna – vol. MM5, Zanichelli, Bologna 1970 [Pom] - C. Pomerance, Alla ricerca dei numeri primi, Le Scienze - quaderni, n.14, marzo 1984 [Rib] - P. Ribenboim, The Book of Prime Number Records, Springer-Verlag, New York 1989 [Rie] H. Riesel, Prime Number and Computer Methods for Factorization, Birkhäuser, Boston 1985 [Rob] - G. Robin, Algorithmique et cryptographie, Mathematiques & Applications, vol. n° 8 (1991), Ellipses – Edition Marketing [Sch] - M.R. Schroeder, La Teoria dei Numeri, franco muzio & c.editore, Padova 1986 [Schn] - B. Schneider, Applied Cryptography, John Wiley & S.Inc., New York [Tch] - P. L. Tchebichef, Teoria delle Congruenze, E. Loescher & C°, Roma 1895 [Te1] - C. Teodoro, La Generazione della chiave privata nell’algoritmo crittografico RSA a chiave pubblica, in “matematicamente.it , – sezione Applicazioni , Ingegneria” [Te2] - C. Teodoro, Un metodo per il calcolo veloce dei numeri di Fibonacci e di Lucas, La Comunicazione, anno 2001, Vol. XLX [Wag] - S.Wagon, Guida a Matematica ( capitoli 8 e 9) , McGraw –Hill Libri Italia srl, Milano, 1995 Siti Internet: [SI0] [SI1] [SI2] [SI3] [SI4] [SI5] [SI6] [SI7] [SI8] - http://ai.eecs.umich.edu/people/rounds/Winter02Slides/LectureApril4.pdf http://164.8.13.169/Enciklopedija/math/math/j/j026.htm http://www.math.swt.edu/~haz/prob_sets/notes/node34.html http://mathworld.wolfram.com/LucasSequence.html http://mathworld.wolfram.com/QuadraticSieve.html http://www.math.ksu.edu/math511/notes/iqs2000.htm http://n.ethz.ch/student/ralbrunn/TQS.html http://mathworld.wolfram.com/Chinese Remainder Theorem.html http://www.math.swt.edu/~haz/prob_sets/notes/node25.html Vengono riportati nelle pagine seguenti: - alcuni esempi di calcolo per congruenze con valori di q e di p non grandi, ottenuti utilizzando il programma riportato in ALLEGATO 1; - una Tabella riguardante diversi risultati di risoluzione di congruenze quadratiche presentanti valori di Q e di p grandi, e quindi risolte con l’impiego di apposito programma utilizzante una aritmetica a precisione multipla; - altri esempi di calcolo per congruenze presentanti anche valori di Q e di p grandi, risolte utilizzando un apposito programma con aritmetica a precisione multipla. 12 ESEMPI di risoluzione della congruenza Allegato 1 z 2 ≡ Q(mod p) con l’utilizzo del programma in ESEMPIO n.1 Risoluzione della Congruenza z^2 = Q (mod p) introdurre Q:876543 accertarsi che il numero che si introduce ora sia primo introdurre il numero primo p:113 k5 = 57 k4 = 28 k3 = 14 k2 = 7 k1 = 3 k0 = 1 per proseguire premere un tasto qualsiasi VALORI INIZIALI: U = 1 V = 5 1 ^it. U( 3 ) = 23 V( 3 ) = 95 2 ^it. U( 7 ) = 23 V( 7 ) = 76 3 ^it. U( 14 ) = 53 V( 14 ) = 96 4 ^it. U( 28 ) = 3 V( 28 ) = 65 5 ^it. U( 57 ) = 0 V( 57 ) = 11 ------------------------------------------------------------LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2= 876543 (mod 113 )SONO: z1 = 62 , z2 = 51 ------------------------------------------------------------VERIFICA: poiché sia (z1^2 - Q) / p =-7723 che (z2^2 - Q) / p =-7734 risultano essere degli INTERI, i valori z1 e z2 trovati per z sono VALIDI 13 ESEMPIO n.2 Risoluzione della Congruenza z^2 = Q (mod p) introdurre Q :-47 accertarsi che il numero che si introduce ora sia primo introdurre il numero primo p: 1427 k9 = 714 k8 = 357 k7 = 178 k6 = 89 k5 = 44 k4 = 22 k3 = 11 k2 = 5 k1 = 2 k0 = 1 per proseguire premere un tasto qualsiasi VALORI INIZIALI: U = 1 V = 3 1 ^it. U( 2 ) = 3 2 ^it. U( 5 ) = 705 3 ^it. U( 11 ) = 926 4 ^it. U( 22 ) = 27 5 ^it. U( 44 ) = 65 6 ^it. U( 89 ) = 582 7 ^it. U( 178 ) = 140 8 ^it. U( 357 ) = 0 9 ^it. U( 714 ) = 0 ------------------------------------------------------------- V( 2 ) = 103 V( 5 ) = 1194 V( 11 ) = 581 V( 22 ) = 1218 V( 44 ) = 892 V( 89 ) = 726 V( 178 ) = 597 V( 357 ) = 885 V( 714 ) = 1328 LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2=-47 (mod 1427 ) SONO: z1 = 664 , z2 = 763 ------------------------------------------------------------VERIFICA: poiché sia (z1^2 - Q) / p = 309 che (z2^2 - Q) / p = 408 risultano essere degli INTERI, i valori z1 e z2 trovati per z sono VALIDI 14 ESEMPIO n.3 Risoluzione della Congruenza z^2 = Q (mod p) introdurre Q:-4407 accertarsi che il numero che si introduce ora sia primo introdurre il numero primo p:5987 k11 = 2994 k10 = 1497 k9 = 748 k8 = 374 k7 = 187 k6 = 93 k5 = 46 k4 = 23 k3 = 11 k2 = 5 k1 = 2 k0 = 1 per proseguire premere un tasto qualsiasi VALORI INIZIALI: U = 1 V = 2 1 ^it. U( 2 ) = 2 V( 2 ) = 2831 2 ^it. U( 5 ) = 4825 V( 5 ) = 899 3 ^it. U( 11 ) = 4357 V( 11 ) = 630 4 ^it. U( 23 ) = 1772 V( 23 ) = 5648 5 ^it. U( 46 ) = 3979 V( 46 ) = 1641 6 ^it. U( 93 ) = 2522 V( 93 ) = 1163 7 ^it. U( 187 ) = 4061 V( 187 ) = 2906 8 ^it. U( 374 ) = 889 V( 374 ) = 5782 9 ^it. U( 748 ) = 3352 V( 748 ) = 2952 10 ^it. U( 1497 ) = 4104 V( 1497 ) = 0 11 ^it. U( 2994 ) = 0 V( 2994 ) = 2667 ------------------------------------------------------------LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2=-4407 (mod 5987 ) SONO: z1 = 4327 , z2 = 1660 ------------------------------------------------------------VERIFICA: poiché sia (z1^2 - Q) / p = 3128 che (z2^2 - Q) / p = 461 risultano essere degli INTERI, i valori z1 e z2 trovati per z sono VALIDI 15 ESEMPIO n.4 Risoluzione della Congruenza z^2 = Q (mod p) introdurre Q: -135908789013753 accertarsi che il numero che si introduce ora sia primo introdurre il numero primo p:146009 k16 = 73005 k15 = 36502 k14 = 18251 k13 = 9125 k12 = 4562 k11 = 2281 k10 = 1140 k9 = 570 k8 = 285 k7 = 142 k6 = 71 k5 = 35 k4 = 17 k3 = 8 k2 = 4 k1 = 2 k0 = 1 per proseguire premere un tasto qualsiasi VALORI INIZIALI: U = 1 V = 3 1 ^it. U( 2 ) = 3 V( 2 ) = 124258 2 ^it. U( 4 ) = 80756 V( 4 ) = 114639 3 ^it. U( 8 ) = 86439 V( 8 ) = 40381 4 ^it. U( 17 ) = 8410 V( 17 ) = 67256 5 ^it. U( 35 ) = 130592 V( 35 ) = 26979 6 ^it. U( 71 ) = 11630 V( 71 ) = 75963 7 ^it. U( 142 ) = 95240 V( 142 ) = 66724 8 ^it. U( 285 ) = 127491 V( 285 ) = 46260 9 ^it. U( 570 ) = 138132 V( 570 ) = 83220 10 ^it. U( 1140 ) = 56470 V( 1140 ) = 138611 11 ^it. U( 2281 ) = 76684 V( 2281 ) = 142727 12 ^it. U( 4562 ) = 42628 V( 4562 ) = 102344 13 ^it. U( 9125 ) = 1845 V( 9125 ) = 39670 14 ^it. U( 18251 ) = 71908 V( 18251 ) = 98068 15 ^it. U( 36502 ) = 77071 V( 36502 ) = 11814 16 ^it. U( 73005 ) = 0 V( 73005 ) = 3064 ------------------------------------------------------------LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2=-135908789013753 (mod 146009 ) SONO: z1 = 1532 , z2 = 144477 ------------------------------------------------------------VERIFICA: poiché sia (z1^2 - Q) / p = 930824753 che (z2^2 - Q) / p = 930967698 risultano essere degli INTERI, i valori z1 e z2 trovati per z sono VALIDI 16 ESEMPIO n.5 Risoluzione della Congruenza z^2 = Q (mod p) introdurre Q: 914013289024689 accertarsi che il numero che si introduce ora sia primo introdurre il numero primo p: 7239913 k21 = 3619957 k20 = 1809978 k19 = 904989 k18 = 452494 k17 = 226247 k16 = 113123 k15 = 56561 k14 = 28280 k13 = 14140 k12 = 7070 k11 = 3535 k10 = 1767 k9 = 883 k8 = 441 k7 = 220 k6 = 110 k5 = 55 k4 = 27 k3 = 13 k2 = 6 k1 = 3 k0 = 1 per proseguire premere un tasto qualsiasi VALORI INIZIALI: U = 1 V = 7 1 ^it. U( 3 ) = 3814471 V( 3 ) = 464162 2 ^it. U( 6 ) = 4524239 V( 6 ) = 1389276 3 ^it. U( 13 ) = 6466284 V( 13 ) = 103638 4 ^it. U( 27 ) = 2137331 V( 27 ) = 3586080 5 ^it. U( 55 ) = 755672 V( 55 ) = 269387 6 ^it. U( 110 ) = 3579243 V( 110 ) = 3500618 7 ^it. U( 220 ) = 2516375 V( 220 ) = 2085313 8 ^it. U( 441 ) = 5800394 V( 441 ) = 3125255 9 ^it. U( 883 ) = 4345372 V( 883 ) = 3408966 10 ^it. U( 1767 ) = 5471662 V( 1767 ) = 3490450 11 ^it. U( 3535 ) = 4073939 V( 3535 ) = 6599295 12 ^it. U( 7070 ) = 5183938 V( 7070 ) = 1258726 13 ^it. U( 14140 ) = 4953913 V( 14140 ) = 1262034 14 ^it. U( 28280 ) = 1487631 V( 28280 ) = 1036035 15 ^it. U( 56561 ) = 1023334 V( 56561 ) = 5969623 16 ^it. U( 113123 ) = 3705203 V( 113123 ) = 2810699 17 ^it. U( 226247 ) = 6798603 V( 226247 ) = 6327610 18 ^it. U( 452494 ) = 4114913 V( 452494 ) = 2135604 19 ^it. U( 904989 ) = 3135477 V( 904989 ) = 3141538 20 ^it. U( 1809978 ) = 7190867 V( 1809978 ) = 1863257 21 ^it. U( 3619957 ) = 0 V( 3619957 ) = 574338 ------------------------------------------------------------LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2= 914013289024689 (mod 7239913 ) SONO: z1 = 287169 , z2 = 6952744 ------------------------------------------------------------VERIFICA: poiché sia (z1^2 - Q) / p =-126235056 che (z2^2 - Q) / p =-119569481 risultano essere degli INTERI, i valori z1 e z2 trovati per z sono VALIDI 17 Tabella relativa ad alcuni esempi di risoluzione di z 2 ≡ Q (mod p) N° Valori numerici cifre Q 1234 5678987 11 p 9 4868303 8 z z1 = 4 6961696 ; z2 Q 3465323 0000231 3204656 7899794 2316565 5600026 4979897 7911667 56 p 7298015 4723001 14 z z1 Q – 59 2 p 98 4613264 9597661 16 z z1 = 47 Q 135 6468976 0313204 0073134 24 p 761308 0239056 7640351 20 z z1 = 1313410 Q z 2 = 272199 0977190 8548802 z 2 = 51 4575006 5861495; 1114868 3636074 1048859 z2 = 447897 5664050 1778856 – 28890 5294 3168489 4447109 1951430 25 z2 46032 4731832 2020680 2359113 26 Q 8 7654321 2345678 9111111 1111111 1111111 1111111 1111111 1111171 57 p 53 1691198 3139663 5054502 8629640 3542017 ** 37 z1 15 5917346 8298253 8785402 6207757 2823122 37 z2 37 5773851 4841409 6269100 2421883 0718895 37 Q p z1 z2 <0.01 secondi 95 anni * 0.01 secondi >640.000 anni * 4 z1 z2 218 giorni * 20 26 z1 <0.01 secondi 16 51326 7900321 6467789 4310543 p 31 secondi 14 p Q <0.01 secondi Tes 8 = 4 7906607 z1 = 4576024 3608133 ; Tal – 7 7733377 7222777 5557770 0077799 9777111 7774447 7766677 7888777 7777 7777777 7777777 7777777 7777777 7777777 7777700 0000000 0000009 479 8533911 9601760 4748610 1891079 7893191 9586463 4160228 3746011 60 7297 9243865 8176017 3029167 5886697 9884585 8191236 5839771 6253998 60 –7650102 3435072 4021320 4567879 9474576 4644002 1042554 1638188 5802832 1465313 2002013 2346567 6897974 4664300 0023132 0405373 8677677 1242564 4157897 934616 3971535 7977769 1635581 9960689 6584051 2375416 3818858 0280321 3276913 2993266 7095499 6198819 0834461 4131776 4296799 2942539 7984261 689981 4054292 4699362 8172983 0223765 1608518 0613867 0383786 6954524 4189812 3629322 8453705 9183558 9925147 0451322 3238265 9961552 4500787 244634 9917243 3278406 3462598 9736924 4975533 1761549 3435071 3325796 9087100 9363943 8641793 7015260 0909314 3680454 1058533 2980987 3483474 0,01 secondi 0.11 secondi 57 0.38 secondi 59 >> 13,7 miliardi di anni *** 133 125 125 2.9 secondi 125 ** p = ( 2 61 + 3) 2 – 8 ( vedi D. Shanks, Solved and Unsolved Problem in Number Theory, pag.225, Third Edition - Chelsea Publishing Company, New York 1985 ). *** Età presunta dell’Universo. 18 2 ESEMPI di risoluzione della congruenza quadratica z ≡ Q(mod p) con l’impiego di un apposito programma in Qbasic in cui si è impiegata l’Aritmetica a Precisione Multipla CALCOLO DEI VALORI CHE SODDISFANO LA CONGRUENZA z^2 = Q (mod p) il numero di cifre che compongono q non deve essere maggiore di 256 Q =135646897603132040073134619121 ( cifre numeriche di Q : 30 ) le cifre che compongono p non devono essere superiori a 125; accertarsi inoltre preventivamente che p sia primo p = 51326790032164677894310543 ( cifre di p : 26 ) ---------------------------------------------------------------------trasformazione della stringa rappresentante Q in numero in Base 10^ 7 Q = 13 5646897 6031320 4007313 4619121 ---------------------------------------------------------------------trasformazione della stringa rappresentante p in numero in Base 10^ 7 p = 51326 7900321 6467789 4310543 ---------------------------------------------------------------------j= 1 j=-1 D=P^2-4*Q); J(D/p)=-1 per P = 2 z1 = 46497 2895469 9808304 7596345 z2 = p - z1 = 4829 5004851 6659484 6714198 ----------------------------------------------------------U[(p + 1) / 2] = 0 Poiché il valore di U di indice k=(p+1)/2 è uguale a 0, i valori trovati z1 e z2 sono le soluzioni cercate della congruenza z^2 = Q (mod p) tempo impiegato: .05859375 secondi CALCOLO DEI VALORI CHE SODDISFANO LA CONGRUENZA z^2 = Q (mod p) il numero di cifre che compongono Q non deve essere maggiore di 256 introdurre Q e quindi premere tasto invio: 4534454763870890054258906331135477685 2334576452344634569 ( cifre numeriche di Q : 56 ) le cifre che compongono p non devono essere superiori a 125; accertarsi inoltre preventivamente che p sia primo p = 5316911983139663505450286296403542017 ( cifre di p : 37 ) ---------------------------------------------------------------------trasformazione della stringa rappresentante Q in numero in Base 10^ 7 Q = 4534454 7638708 9005425 8906331 1354776 8523345 7645234 4634569 ---------------------------------------------------------------------trasformazione della stringa rappresentante p in numero in Base 10^ 7 p = 53 1691198 3139663 5054502 8629640 3542017 ---------------------------------------------------------------------D=P^2-4*Q); J(D/p)=-1 per P = 1 z1 = 25 8457755 8909131 7019925 9334816 2908113 z2 = p - z1 = 27 3233442 4230531 8034576 9294824 633904 ----------------------------------------------------------U[(p + 1) / 2] = 0 Poichè il valore di U di indice k=(p+1)/2 è uguale a 0, i valori trovati z1 e z2 sono le soluzioni cercate della congruenza z^2 = Q (mod p) tempo impiegato: .109375 secondi 19 CALCOLO DEI VALORI CHE SODDISFANO LA CONGRUENZA z^2 = Q (mod p) il numero di cifre che compongono Q non deve essere maggiore di 256 Q =12345678987 ( cifre numeriche di Q : 11 ) le cifre che compongono p non devono essere superiori a 125; inoltre accertarsi prima di introdurlo che p sia primo introdurre p e premere quindi tasto invio: p = 72980154723001 ( cifre di p : 14 ) ---------------------------------------------------------------------trasformazione della stringa rappresentante Q in numero in Base 10^ 7 Q = 1234 5678987 ---------------------------------------------------------------------trasformazione della stringa rappresentante p in numero in Base 10^ 7 p = 7298015 4723001 ---------------------------------------------------------------------la congruenza non è risolubile CALCOLO DEI VALORI CHE SODDISFANO LA CONGRUENZA z^2 = Q (mod p) il numero di cifre che compongono Q non deve essere maggiore di 256 Q =-4650102343507240213204567879947457646440021042554163818858028321465313200201 323465676897974466430000231320405373867767712425644157897 ( cifre numeriche di Q : 133 ) le cifre che compongono p non devono essere superiori a 125; inoltre accertarsi prima di introdurlo che p sia primo p = 1234567890123456789012345678901234567890123456789012345678901234567890123456 789012345678901234567890123456789479 ( cifre di p : 112 ) ------------------------------------------------------------------------------------------------------trasformazione della stringa rappresentante Q in numero in Base 10^ 7 Q = - 4650102 3435072 4021320 4567879 9474576 4644002 1042554 1638188 5802832 1465313 2002013 2346567 6897974 4664300 23132 405373 8677677 1242564 4157897 ------------------------------------------------------------------------------------------------------trasformazione della stringa rappresentante p in numero in Base 10^ 7 p = 1234567 8901234 5678901 2345678 9012345 6789012 3456789 123456 7890123 4567890 1234567 8901234 5678901 2345678 9012345 6789479 ------------------------------------------------------------------------------------------------------D=P^2-4*Q); J(D/p)=-1 per P = 3 z1 = 1014897 3418285 9321816 4268019 1710912 7936229 9912701 1935856 6133404 8116736 4624180 8232995 5880411 649928 6334414 4622692 z2 = p - z1 = 219670 5482948 6357084 8077659 7301432 8852782 3544087 8187600 1756718 6451153 6610387 668238 9798490 1695750 2677931 2166787 ----------------------------------------------------------U[(p + 1) / 2] = 0 Poichè il valore di U di indice k=(p+1)/2 è uguale a 0, i valori trovati z1 e z2 sono le soluzioni cercate della congruenza z^2 = Q (mod p) tempo impiegato: 1.76 secondi 20 Allegato 1 REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM REM Algoritmo per RISOLVERE LA CONGRUENZA z^2 = Q (mod p)con l'ausilio del calcolo veloce del valore numerico di V(k) relativo alla Sequenza di Lucas avente un dato P ed un dato Q. Detta sequenza Š una successione di numeri, i cui primi due, V(0) e V(1), hanno i seguenti valori: V(0)=2, V(1)= P ed il cui termine generico V(n) Š dato dalla seguente formula: V(n) = P*V(n-1) - Q*V(n-2). Per un numero primo p si DIMOSTRA che la congruenza z^2 # Q (mod p), ammesso che sia risolvibile, ha per soluzione il valore z = V(k)/2, o z=[(p-V(y)]/2 per V(k) dispari, dove k=(p+1)/2, se P Š scelto in modo che il valore D = P^2-4*Q sia un non residuo quadratico di p. -----------------------------------------------------------------------Occorre innanzitutto vedere se la congruenza z^2 = Q(mod p) ha soluzioni; a tal fine Q deve essere residuo quadratico di p; per vedere ci• si calcola il simbolo di Jacobi(Q/p) e solo se esso ha valore +1 la congruenza ha soluzioni; si prosegue andando a calcolare un valore minimo per P tale per cui risulti D = P^2 - 4 * Q non residuo quadratico. di p, vale a dire il simbolo di JACOBI: (D/p) deve avere valore -1. Una volta constatato che la congruenza Š risolvibile e calcolato il valore appropriato di P, si deve trovare un numero INT(LOG(k) / log2) di indici opportuni da assegnare a U(k) ed a V(k), necessari per il calcolo veloce di V(k), tramite la seguente procedura: iniziando dall'indice k =(p+1)/2 se l'indice k Š di valore pari si calcola k1 = k/2; se l'indice k Š di valore dispari si calcola k1 = (k+1) / 2 ; si procede ulteriormente con k1 come fatto per k, e cos facendo si prosegue sino ad arrivare all'indice di valore 1. Il valore di Q non deve essere maggiore di 10^15 e quello di p non deve avere pi— di 7 cifre per avere dei risultati esatti,in quanto in questo programma non si va oltre la doppia precisione nei calcoli effettuati. ----------------------------------------------------------------------- CLS : DEFDBL A-Z: DIM a(100), b(100), c(100), x(100), m(100), y(100), i$(100), r$(100), cf(100) PRINT " Risoluzione della Congruenza z^2 = Q (mod p)": PRINT 5 : INPUT "introdurre Q:", Q IF Q > 10 ^ 15 THEN PRINT " Introdurre un Q piu' piccolo": GOTO 5 PRINT "accertarsi che il numero che si introduce ora sia primo" 15 INPUT "introdurre il numero p:", np rd = INT(SQR(np)): FOR h = 3 TO rd STEP 2: pp = np / h: IF pp = INT(pp) GOTO nonpr NEXT h PRINT "essendo il numero p introdotto primo si pu• proseguire,": GOTO pros nonpr: PRINT "il numero introdotto non Š primo": GOTO 15 pros: IF np > SQR(9 * 10 ^ 15) THEN PRINT " valore troppo alto,introdurre"; IF np > SQR(9 * 10 ^ 15) THEN PRINT " un numero primo piu' basso": GOTO 15 t1 = TIMER REM -----------------------------------------------------------------------REM CALCOLO DEL SIMBOLO DI JACOBI(+-1,0) di J = (Q/np) IF Q / 2 = INT(Q / 2) AND np / 2 = INT(np / 2) THEN PRINT "J = "; 0: END qj = Q: settare: pj = np: dj = 1: sj = 1: bj = 0: s1j = 1: s2j = 1: smj = 1 p1j = 0: p2j = 0: r = 0: r2 = 0 inizioj: r = qj - INT(qj / pj) * pj: ' PRINT qj, pj, r, IF pj = 1 GOTO risol IF pj > 1 AND r = 0 AND pp = 1 THEN PRINT "++J = "; 0, qj: GOTO cercarnr IF pj > 1 AND r = 0 THEN PRINT : PRINT "++J = "; 0: END r2 = r / 2: IF r2 = INT(r2) GOTO 40 IF r2 <> INT(r2) GOTO erre1 40 r2 = r / 2: IF r2 <> INT(r2) GOTO 50 r = r / 2: bj = bj + 1: 21 GOTO 40 50 p2j = (pj ^ 2 - 1) / 16: IF p2j <> INT(p2j) AND bj / 2 <> INT(bj / 2) THEN smj = -1 erre1: IF r > pj GOTO 60 r1 = (r - 1) / 4: p1j = (pj - 1) / 4 IF r1 = INT(r1) OR p1j = INT(p1j) THEN s2j = 1: GOTO 60 s1j = -1 60 sj = sj * s2j * s1j * smj: s1j = 1: smj = 1: bj = 0: smj = 1: bj = 0 70 qj = pj: pj = r: IF r = 0 THEN END GOTO inizioj risol: IF sj = -1 AND nr = 0 THEN PRINT "la congruenza NON Š RISOLVIBILE": END IF sj = 1 AND nr = 0 GOTO cercarnr IF sj = 1 AND nr = 2 THEN nr = 3: qj = nr: GOTO settare IF sj = -1 AND qj > 0 GOTO continua cercarnr: Px = Px + 1: pp = 1: ' PRINT "Px = "; Px, qj = Px ^ 2 - 4 * Q: nr = qj: ' PRINT "qj ="; qj 'DO: y$ = INKEY$: LOOP WHILE y$ = "" GOTO settare continua: p1 = np: p = Px: D = p ^ 2 - 4 * Q: DD = D: 'print"P=";P,"D="; IF p > np THEN p = p - INT(p / np) * np IF ABS(D) > np THEN D = D - INT(D / np) * np 'PRINT "il numero D=P^2-4Q ="; D; " risulta essere il pi— piccolo non" 'PRINT "residuo quadratico di np" 'PRINT p1, p, Q, D; DD 'PRINT "---------------------------------------------------------------------" 'DO: y$ = INKEY$: LOOP WHILE y$ = "" n = -1: x = np + 1: x(0) = x IF x = INT(x / 2) * 2 THEN a(0) = 0: ' PRINT 0; a(0), x IF x <> INT(x / 2) * 2 THEN a(0) = 1: ' PRINT 0; a(0), x 105 x = INT(x / 2): n = n + 1 IF x = INT(x / 2) * 2 THEN a(n) = 0: x(n) = x: 'PRINT n; a(n), x(n) IF x <> INT(x / 2) * 2 THEN a(n) = 1: x(n) = x: ' PRINT n; a(n), x(n) IF x = 1 THEN ns = n: GOTO 20: ' PRINT "n="; n: PRINT "ns="; ns: GOTO 20 GOTO 105 20 ' k$ = STR$(k): PRINT "k$ ="; k$ FOR h = 0 TO n: i$(n - h) = STR$(n - h): NEXT h '20 PRINT : FOR h = 0 TO n: PRINT "k"; n - h; " = "; x(h): NEXT h '20 FOR h = 0 TO n: cf(h) = LEN(i$(h)) - 1: r$(h) = RIGHT$(i$(h), cf(h)): NEXT h PRINT : FOR h = 0 TO n: PRINT "k" + r$(n - h); " = "; x(h): NEXT h PRINT "per continuare premere un tasto qualsiasi" DO: y$ = INKEY$: LOOP WHILE y$ = "" U = 1: V = Px: FOR k = 0 TO ns: b(k) = a(n - k): y(k) = x(n - k): NEXT k FOR k = 0 TO ns: a(k) = b(k): x(k) = y(k): NEXT k 'FOR k = ns TO 0 STEP -1: PRINT k, b(k), y(k): NEXT k PRINT : PRINT " VALORI INIZIALI: U = 1 V ="; Px PRINT : 'DO: Y$ = INKEY$: LOOP WHILE Y$ = "" REM ===================== inizio loop principale ========================== Qi = Q: Q0 = ABS(Q): IF Q < 0 THEN m$ = "-" IF Q < 0 THEN Q = -Q FOR k = 1 TO ns: it = it + 1: ' PRINT it; "^it.", IF ABS(Q) < np AND k = 1 GOTO duequ IF ABS(Q) > np AND k = 1 THEN Q0 = Q0 - INT(Q0 / np) * np IF ABS(Q) > np AND k = 1 THEN Q = Q0: GOTO duequ Q = Q - INT(Q / np) * np quadrato: Q = Q * Q: ' PRINT "Q*Q ="; Q; Q = Q - INT(Q / np) * np: ' PRINT "rQ*Q ="; Q; IF x(k - 1) / 2 = INT(x(k - 1) / 2) GOTO duequ Q = Q * Q0: ' PRINT "Q*Q*Q0 ="; Q, Q = Q - INT(Q / np) * np: ' PRINT "res Q*Q*Q0 ="; Q 'res: Q = Q - INT(Q / np) * np: 'PRINT "res di Q ="; Q duequ: q2 = 2 * ABS(Q): ' PRINT "q2 ="; q2, 22 Rn = q2 - INT(q2 / np) * np: ' PRINT "Rn di q2 ="; Rn; Rp = np - Rn IF a(k - 1) = 1 AND m$ = "-" THEN Rp = Rn 'IF X(k - 1) / 2 <> INT(X(k - 1) / 2) AND m$ = "-" THEN Rp = Rn squdue: ' PRINT "Rp di q2 ="; Rp; x = U * V: IF x > np THEN x = x - INT(x / np) * np: ' PRINT "+++++ X="; X y = V ^ 2 + Rp: IF y > np THEN y = y - INT(y / np) * np: ' PRINT "+++++ Y="; Y U = x: V = y IF U = np THEN U = 0 IF a(k) = 1 GOTO akappa1 'IF a(k) = 0 THEN PRINT it; "^it."; "a("; k; ")="; a(k), "U ="; X, "V ="; y IF a(k) = 0 THEN PRINT it; "^it."; TAB(15); "U("; x(k); ") ="; x; TAB(45); "V("; x(k); ") ="; y IF a(k) = 0 GOTO nekk1 'DO: y$ = INKEY$: LOOP WHILE y$ = "" akappa1: 'PRINT "======================== a(k)=1 ======================"; 'PRINT it; "^it."; : ' "a("; k; ")="; a(k), REM 2 * U = P * X + Y U2 = p * x + y: IF U2 <> INT(U2 / 2) * 2 THEN U = (np + U2) / 2 IF U2 = INT(U2 / 2) * 2 THEN U = U2 / 2 IF U >= np THEN U = U - INT(U / np) * np IF D < 0 THEN D = D - INT(D / np) * np: ' PRINT "D="; D REM 2 * V = P * Y + D * X V2 = p * y + D * x: 'PRINT "????? 2V =;"; V2 IF V2 <> INT(V2 / 2) * 2 THEN V = (np + V2) / 2: IF V2 = INT(V2 / 2) * 2 THEN V = V2 / 2 IF V > np THEN V = V - INT(V / np) * np: PRINT it; "^it."; TAB(15); "U("; x(k); ") ="; U; TAB(45); "V("; x(k); ") ="; V nekk1: IF k = 0 GOTO zeta NEXT k zeta: z = V / 2: IF z = INT(V / 2) THEN za = z: zb = np - za IF z <> INT(V / 2) THEN za = (np - V) / 2: za = np - za: zb = np - za REM zb = (np + V) / 2 quz: PRINT "-------------------------------------------------------------" PRINT PRINT " LE DUE SOLUZIONI z1 e z2 DELLA CONGRUENZA z^2="; Qi; "(mod"; np; ")"; PRINT "SONO:": PRINT : PRINT " z1 ="; za; " ,"; " z2 ="; zb 'PRINT "il loop Š composto da"; it; "iterazioni" PRINT : PRINT "-------------------------------------------------------------" PRINT "VERIFICA:": Pz1 = (za * za - Qi) / np: Pz2 = (zb * zb - Qi) / np IF Pz1 = INT(Pz1) AND Pz2 = INT(Pz2) GOTO 123 PRINT " i valori z1 e z2 trovati per z NON sono VALIDI": END 123 PRINT "poich‚ sia (z1^2 - Q) / p ="; Pz1; PRINT " che (z2^2 - Q) / p ="; Pz2; "risultano essere degli INTERI,"; PRINT " i valori z1 e z2 trovati per z sono VALIDI": GOTO tempo tempo: 'PRINT : t2 = TIMER - t1: PRINT "tempo di calcolo:"; t2; "secondi" END 23