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