Per n = p^a * q^b
, il numero totale è φ(n) = (p-1)*p^(a-1) * (q-1)*q^(b-1)
. Senza perdita di generalità, p < q
.
Quindi, se gcd(n,φ(n)) = p^(a-1) * q^(b-1)
p
non divide q-1
e gcd(n,φ(n)) = p^a * q^(b-1)
se p
divide q-1
.
Nel primo caso, abbiamo n/gcd(n,φ(n)) = p*q
e φ(n)/gcd(n,φ(n)) = (p-1)*(q-1) = p*q + 1 - (p+q)
, quindi hai x = p*q = n/gcd(n,φ(n))
e y = p+q = n/gcd(n,φ(n)) + 1 - φ(n)/gcd(n,φ(n))
. Quindi trovare p
e q
è semplice: y^2 - 4*x = (q-p)^2
, quindi q = (y + sqrt(y^2 - 4*x))/2
e p = y-q
. Quindi trovare gli esponenti a
e b
è banale.
Nel secondo caso, n/gcd(n,φ(n)) = q
. Quindi puoi facilmente trovare l'esponente b
, dividendo per q
finché la divisione non lascia un resto, e quindi ottieni p^a
. Dividere φ(n)
da (q-1)*q^(b-1)
ti dà z = (p-1)*p^(a-1)
. Quindi p^a - z = p^(a-1)
e p = p^a/(p^a-z)
. Trovare l'esponente a
è di nuovo banale.
Quindi rimane da decidere quale caso avete. Hai il caso 2 se e solo se n/gcd(n,φ(n))
è un numero primo.
Per questo, è necessario un test di primalità decente. Oppure, si può supporre che si abbia il caso 1 e, se ciò non funziona, concludere che si ha il caso 2.
fonte
2012-04-27 17:01:47
+1 come hai fatto semplicemente –
Fondamentalmente, devi conoscere la formula per il totiario, e che vuoi trovare 'p * q' e' p + q'. Da quel momento in poi, mescoli gli ingredienti fino a quando il risultato desiderato non viene fuori. –
Inoltre c'è il caso 3: 'gcd (n, φ (n)) = p^(a-1) * q^b' –