| Download
All published worksheets from http://sagenb.org
Project: sagenb.org published worksheets
Views: 168738Image: ubuntu2004
MESSAGE IMPORTANT :
Avant tout, il faut faire Action->Evaluate All afin que les fonctions antécédentes soient reconnues par les fonctions ultérieures.
J'ai tout testé plusieurs fois et ça devrait fonctionner chez vous aussi ^^
Bonne lecture ;)
QUESTION 1 :
La fonction suivante est destinée à décomposer un nombre n-1 (on donne d'abord l'impair potentiellement premier n, auquel on retranche 1 afin de procéder au test de primalité) en produit de 2**s et d. n-1 est donc pair si on suppose n premier.
Je définis ci-dessous une fonction permettant de calculer a**d[n], répondant au doux nom de ExpoModulo ^^
Voilà enfin le fameux test (enfin le mien) de primalité de Miller Rabin :
Tout d'abord, un nombre a est choisi aléatoirement entre 1 et n-1, afin de satisfaire les conditions du théorème de Fermat.
On pose ensuite n-1 = d*2**s grâce à decomposition(n), puis on étudie les valeurs (modulo n) de c = a**d
Si a**(n-1)=1[n], alors n a de fortes chances d'être premier : c'est le cas lorsque c*b = (a**d)*(a**2**s) = a**(n-1) = 1[n]
La fonction suivante définit des statistiques, qui sont avant tout le principe de base du test de Miller Rabin :
On entre le nombre de tests à effectuer, puis le nombre dont on désire tester la primalité.
La sortie est le nombre d'itérations (utile pour la fonction suivante), les résultats positifs et négatifs.
Enfin vient la fonction qui permet de donner un résultat de primalité, si le nombre de tests est supérieur à 100.
En dessous, c'est trop peu précis pour être fiable.
QUESTION 2 :
Voilà ma fonction Prem(i). Elle renvoie le premier nombre n tiré au hasard entre 10**(i-1) et 10**i-1 dont la primalité est vérifiée par mon test Miller Rabin, mais aussi les statistiques sur 100 essais.
18913
QUESTION 3:
La fonction récursive pgcd(a,b), qui fonctionne aussi comme pgcd(b,a), rapide d'exécution.
Arrive donc la fonction PremierAvec(a,n), réponse à la question 3, qui utilise la fonction pgcd(a,b) précédemment écrite.
QUESTION 4 :
Un élément dans Z/nZ est dit inversible (mod n) s'il admet un autre élément de Z/nZ tel que le produit des deux est congru à 1 (mod n).
La fonction Inverse(a,n) cherche donc un inverse à a, dans Z/nZ
QUESTIONS 5 & 6 :
Le codage RSA : On choisit d'abord deux nombres p et q supposés premiers, et pour la suite, les notes dans la fonction parlent d'elles mêmes.
clef publique (32447, 70437) clef privee (60891, 69836)
message a coder message code 59190
message decode 6543
QUESTION 7 :
Je définis tout d'abord les fonctions permettant de calculer le modulo (car sage craint la division de zéro ^^'), puis les fonctions de conversion de binaire à décimal, et vice et versa, et enfin la conversion de chaine de caractère en binaire, et l'inverse.
0
'neiluJ'
Enfin nous pouvons créer les fonctions Encodage et Décodage, très facilement à l'aide des fonctions usuelles précédentes.
Et ça marche à la perfection !