Prime Generation

Dans la continuité du sujet abordé dans cette série d'articles , nous parlerons aujourd'hui de la génération des nombres premiers. La génération est probabiliste et garantie. Ainsi, notre cas est avec une garantie qui vous permet d'utiliser les numéros obtenus dans les applications liées à la cryptographie, ce qui garantit, par exemple, la sécurité de la gestion de votre argent via des applications bancaires. De plus, vous verrez comment il est garanti de recevoir des nombres premiers de taille suffisante pour la cryptographie, ainsi que les problÚmes qui peuvent survenir si vous négligez les garanties.

image

Le schéma général de sécurité pour l'échange de données est basé sur la complexité de la factorisation d'un grand nombre composite. De plus, s'il existe de nombreux facteurs, ils seront faibles, ce qui simplifie considérablement le piratage du systÚme de sécurité. Par conséquent, un grand nombre composite est obtenu en multipliant deux nombres premiers d'une certaine taille. Mais ici, un problÚme est évident - comment choisir un nombre premier suffisamment grand?

Déterminez d'abord la taille. Dans la cryptographie moderne, l'ordre du nombre composite est déterminé par la formule 22048 c'est-à-dire que l'ordre réel est 2048 en notation binaire. Et les diviseurs de ce nombre composite sont de l'ordre de 1024, c'est-à-dire quelque part autour des valeurs 21024 . Pourquoi 1024? Parce qu'il y a dix ans, un facteur de l'ordre de 768 était factorisé, et aujourd'hui il est trÚs probable que les nombres composés de l'ordre de 1024 soient décomposés. Il a donc été décidé pour la fiabilité de doubler l'ordre à la fois, c'est-à-dire jusqu'en 2048. Eh bien, partir de cet ordre est facile à déterminer ordre des facteurs requis.

Mais que se passe-t-il si l'ordre des facteurs est bien infĂ©rieur Ă  1024? Ensuite, dans un temps acceptable, vous pouvez dĂ©composer un nombre composite, mĂȘme s'il est de l'ordre de 2048. Cela signifie qu'il faut garantir que les facteurs choisis par nous ont un ordre proche de 1024 et sont simples, c'est-Ă -dire qu'ils ne peuvent pas ĂȘtre factorisĂ©s. Mais ici, le choix lui-mĂȘme est effectuĂ© selon un schĂ©ma probabiliste, ce qui ne fait que conduire Ă  des problĂšmes potentiels.

La probabilitĂ© de la simplicitĂ© d'un nombre est vĂ©rifiĂ©e sur la base de l'hypothĂšse que le nombre est "trĂšs probablement" premier si sa pĂ©riode (qui est dĂ©crite ici ) est un diviseur du nombre lui-mĂȘme, moins un ( N−1 ) Sous la forme d'une formule, cela ressemble Ă  ceci:

ap pmodN=1


N−1 pmodp=0



Ici N - numĂ©ro enquĂȘtĂ©, a - valeur de 2 avant N−2 (il dĂ©termine la base du systĂšme numĂ©rique dans lequel la pĂ©riode est calculĂ©e), p - pĂ©riode du numĂ©ro examinĂ©. Fonctionnement mod ici signifie prendre le reste de la division du premier opĂ©rande par le second.

Les contrÎles existants reposent sur une telle approche, car pour de grands nombres, la détermination inconditionnelle de la simplicité par des tests connus prend beaucoup de temps. Mais le inconvénient d'une telle vérification est évident - parfois, vous pouvez obtenir un nombre composite, au lieu d'un simple. De plus, personne ne sait quels diviseurs feront partie d'un tel nombre. Plus précisément, un attaquant pourra le découvrir en appliquant les méthodes de factorisation bien connues, qui commencent à fonctionner dans un temps acceptable si les facteurs sont de l'ordre de moins de quelques centaines de bits.

Quelle est la fréquence des erreurs de simplicité probabiliste? Assez rarement. Il y a une erreur pour plusieurs dizaines de milliers de simples, et parfois deux, mais rien ne nous garantit de trois. De plus, cela dépend beaucoup du test utilisé. Ainsi, par exemple, dans la bibliothÚque de langage Java standard de la classe BigInteger, une vérification est implémentée qui permet une absence de 2 à 3 fois pour mille simples. Autrement dit, vous ne devriez pas penser que s'il y a théoriquement trÚs peu d'erreurs, alors dans la pratique, tout sera dans le chocolat.

Comment est-ce dangereux? Cela ne semble pas aussi effrayant que certains peuvent le dire, car si un site qui ferme la navigation sur ses pages avec le protocole https reçoit une clĂ© facilement calculĂ©e, alors quel sera le problĂšme? Eh bien, les pirates dĂ©couvriront quelles nouvelles vous lisez sur ce site, et quel est le point? Mais en fait, le cryptage ne se fait pas uniquement lors de la navigation sur le Web. Une situation plus dĂ©sagrĂ©able se produira si les pirates dĂ©couvrent la clĂ© de votre service bancaire prĂ©fĂ©rĂ© pour gĂ©rer Ă  distance votre argent. Bien que, encore une fois, il semble que pour ouvrir sĂ»rement l'Ă©change avec la banque (et si la banque utilise un contrĂŽle de simplicitĂ© faible), le pirate devra attendre environ 500 ans jusqu'Ă  ce que la probabilitĂ© d'Ă©mettre une clĂ© facilement calculable soit enfin rĂ©alisĂ©e, car les clĂ©s ont gĂ©nĂ©ralement une pĂ©riode de validitĂ© de 1 an et par consĂ©quent, pour garantir le piratage, vous devez attendre que 500 numĂ©ros d'une nouvelle clĂ© soient exĂ©cutĂ©s. Il semble que tout soit logique, mais il y a un autre «mais» - il y a beaucoup plus de banques que 500 dans le monde. Par consĂ©quent, en ce moment, peut-ĂȘtre dans votre banque prĂ©fĂ©rĂ©e, les pirates peuvent avoir accĂšs Ă  votre propre argent.

As-tu peur? Sûrement pas, car nous sommes tous trÚs courageux, jusqu'à ce que le coq rÎti picote. Mais il y a encore quelque chose à craindre. Bien que la probabilité d'une attaque réussie par des pirates informatiques précisément sur votre banque ne soit pas si élevée, mais néanmoins, si elle est réalisée, votre argent ne sera probablement pas trouvé. Pourquoi? C'est trÚs simple - la premiÚre hypothÚse standard du service de sécurité de la banque est de blùmer quelqu'un avec les droits d'accÚs appropriés. Pas un pirate informatique, la probabilité d'ingérence qu'ils considÚrent également comme minime, à savoir quelqu'un à eux. Par conséquent, un pirate pourrait bien rester impuni.

Comment résoudre ce problÚme? Vous devez apprendre à obtenir des nombres premiers garantis. Mais comment garantir leur simplicité? Il existe quatre méthodes pour cela.

La premiÚre méthode casse avec un minimum de restrictions. Il s'agit généralement d'une variante du tamis amélioré d'EratosthÚne. La méthode est fiable et garantie, mais limitée à des commandes trÚs modestes (moins d'une centaine). Par conséquent, cette méthode n'est pas applicable en cryptographie.

La deuxiĂšme mĂ©thode est l'Ă©numĂ©ration avec des restrictions plus strictes. Donc, si la pĂ©riode d'un nombre est Ă©gale au nombre lui-mĂȘme, moins un, alors le nombre est garanti premier. La formule ici est - N−1=p . Mais pour dĂ©terminer l'Ă©galitĂ© de la pĂ©riode de la diffĂ©rence entre le nombre et l'unitĂ©, on utilise des mĂ©thodes trĂšs lourdes qui ne fonctionnent pas pour toutes les classes de nombres. Par consĂ©quent, leur utilisation en cryptographie repose soit sur le nombre limitĂ© de nombres de classes spĂ©cifiques, soit lors de la vĂ©rification, si nous augmentons la taille du nombre. Et d'ailleurs, mĂȘme les nombres d'une certaine classe ne garantissent rien par eux-mĂȘmes, ce qui signifie la nĂ©cessitĂ© de trier de nombreux nombres de candidats. Ici, par exemple, les nombres de Mersenne, pour lesquels il existe un test inconditionnel de simplicitĂ©, ont dĂ©jĂ  Ă©tĂ© triĂ©s et ont dĂ©couvert qu'ils sont pratiquement absents dans la gamme utilisĂ©e en cryptographie. Voici leur liste complĂšte des commandes fermĂ©es - 1279, 2203, 2281, 3217. Comme vous pouvez le voir, de 1024 Ă  2048, il n'y a qu'un seul numĂ©ro appropriĂ©. Mais mĂȘme si nous prenons le reste, leur nombre nous indique trĂšs clairement - ça ne vaut pas le coup! Encore une fois, nous n'avons pas eu de chance avec la mĂ©thode de vĂ©rification.

La troisiĂšme mĂ©thode est probabiliste. C'est elle qui est utilisĂ©e aujourd'hui, y compris dans votre banque prĂ©fĂ©rĂ©e. Comment fonctionne-t-il? TrĂšs simple - le reste de la division d'un nombre arbitraire en une puissance est vĂ©rifiĂ© N−1 sur N si le reste est un, il est probable que le nombre soit premier. Et ici, le mot «probablement» est le plus dĂ©sagrĂ©able ici. Bien que les mĂ©thodes probabilistes de vĂ©rification de la simplicitĂ© contiennent Ă©galement des amĂ©liorations supplĂ©mentaires, nĂ©anmoins, comme indiquĂ© ci-dessus, la bibliothĂšque Java standard se trompe souvent.

Et enfin, la quatriĂšme mĂ©thode. Il ne fonctionne pas aussi vite que les tests probabilistes (bien que quelque chose puisse ĂȘtre optimisĂ© ici aussi), mais il donne des nombres premiers garantis, et mĂȘme avec une pĂ©riode facilement dĂ©finissable. À quoi sert une pĂ©riode de pointe, demandez-vous? Par exemple, pour gĂ©nĂ©rer une sĂ©quence pseudo-alĂ©atoire ou de chiffrement. Plus prĂ©cisĂ©ment, connaissant la pĂ©riode, nous savons exactement combien de nombres seront dans la sĂ©quence, ce qui permet de planifier facilement combien de temps nous pouvons utiliser le gĂ©nĂ©rateur de sĂ©quence en fonction de ce nombre. Certes, cela s'applique dĂ©jĂ  au chiffrement symĂ©trique, mais il peut Ă©galement ĂȘtre utile dans un certain nombre de cas. Ensuite, nous considĂ©rerons une thĂ©orie qui garantit la simplicitĂ© de la vĂ©rification des nombres candidats.

Contexte théorique


Pour comprendre comment générer des nombres premiers garantis, vous devez plonger dans un peu de mathématiques. Mais ne vous inquiétez pas, les mathématiques sont ici au cinquiÚme niveau.

Pour ĂȘtre complet, il est recommandĂ© de regarder ici pour plus de dĂ©tails sur ce qu'est une pĂ©riode et une sĂ©rie de rĂ©sidus. Eh bien, disons briĂšvement qu'un certain nombre de rĂ©sidus se forment en divisant le «coin» (une mĂ©thode connue de tout Ă©tudiant) de l'unitĂ© par le nombre choisi pour l'Ă©tude. Dans le mĂȘme temps, Ă  chaque Ă©tape, une diffĂ©rence apparaĂźt entre le nombre supĂ©rieur, avec un zĂ©ro ajoutĂ©, et le produit du nombre Ă©tudiĂ© par une valeur de 0 Ă  9 (pour le systĂšme de nombres dĂ©cimaux) - c'est le reste. Mais il y a de nombreuses Ă©tapes dans la division par le «coin», donc il y a aussi beaucoup de rĂ©sidus, et ensemble ils forment une sĂ©rie de rĂ©sidus dans laquelle le mĂȘme ensemble de nombres est rĂ©pĂ©tĂ© pĂ©riodiquement un nombre infini de fois. Un signe du dĂ©but d'un nouveau cycle est un reste Ă©gal Ă  un. La quantitĂ© de rĂ©sidu entre les unitĂ©s est la longueur de la pĂ©riode (ou cycle). En fait, c'est tout, mais il vaut Ă©galement la peine de comprendre qu'une telle mĂ©thode de construction d'une sĂ©rie de soldes peut ĂȘtre appliquĂ©e en utilisant n'importe quel systĂšme numĂ©rique, et en particulier, le systĂšme avec la base 2 (et non 10, comme c'est la coutume Ă  l'Ă©cole) sera le plus souvent utilisĂ©. Lorsque vous utilisez d'autres systĂšmes numĂ©riques, toutes les rĂšgles sont conservĂ©es, mais le nombre de variantes de produit Ă  chaque Ă©tape sera diffĂ©rent, Ă©gal Ă  b (Ă  partir de la base), c'est-Ă -dire la base du systĂšme numĂ©rique.

Ainsi, d'aprĂšs ce qui a Ă©tĂ© montrĂ© prĂ©cĂ©demment, nous savons que les nombres composites donnent toujours des pĂ©riodes relativement courtes qui n'incluent pas un certain nombre de valeurs «interdites». Connaissant la factorisation d'un nombre composĂ©, il est facile de calculer combien de valeurs doivent ĂȘtre absentes dans un certain nombre de rĂ©sidus qui forment la pĂ©riode d'un nombre donnĂ©. Une sĂ©rie de rĂ©sidus ne contiendra pas de facteurs et tous les nombres qui sont des multiples de ces facteurs si la sĂ©rie elle-mĂȘme est construite sur la base d'un systĂšme numĂ©rique qui n'est pas un multiple de l'un des diviseurs (c'est-Ă -dire que la base n'est pas divisĂ©e par les diviseurs du nombre). Par exemple, s'il n'y a que deux facteurs, le nombre de rĂ©sidus multiples est dĂ©terminĂ© par la formule m=a+b−2 oĂč m - le nombre de rĂ©sidus multiples, a et b Ce sont les facteurs qui forment notre nombre composite. Connaissant le nombre de rĂ©sidus «interdits», il est facile de calculer qu'une sĂ©rie de rĂ©sidus plus longue que la moitiĂ© de la valeur N−1 aura une longueur Ă©gale Ă  L=N−1−(a+b−2)=N−a−b+1 . Autrement dit, une telle sĂ©rie sera sur a + b - 2 plus courte que la sĂ©rie qui se rĂ©vĂ©lerait si le nombre donnĂ© Ă©tait premier. Cela explique pourquoi tous les nombres avec une pĂ©riode Ă©gale Ă  la pĂ©riode complĂšte (c.-Ă -d. N - 1 ), s'avĂšrent simples - si au moins un Ă©lĂ©ment (qui est «interdit») Ă©tait exclu de la sĂ©quence des rĂ©sidus, alors la pĂ©riode deviendrait moins longue N - 1 . Du fait de l'existence d'une telle rĂ©gularitĂ©, nous observons l'opĂ©rabilitĂ© de tous ces tests de probabilitĂ©, qui vĂ©rifient aujourd'hui la simplicitĂ© d'un nombre. Ces tests calculent des valeurs dans une sĂ©rie de soldes par position. N - 1 ou ( N - 1 ) / 2 , et si les valeurs sont Ă©gales 1 ou N - 1 , il est fort probable que le nombre soit premier. Pourquoi seulement avec une forte probabilitĂ© et non garanti? Parce que les tests probabilistes de pĂ©riode ne sont pas calculĂ©s, mais entre les positions N - 1 et ( N - 1 ) / 2 il peut y avoir plus d'unitĂ©s, ce qui signifie l'inĂ©galitĂ© de la pĂ©riode Ă  la valeur N - 1 mais si la pĂ©riode n'est pas Ă©gale N - 1 , alors le nombre peut ĂȘtre composite. De plus, le manque d'Ă©galitĂ© en soi n'est pas critique, une autre chose est importante - les nombres pseudo-simples peuvent donner un tel arrangement d'unitĂ©s. Parmi les chiffres vĂ©rifiĂ©s par un tel test, vous pouvez trouver des pseudo-simples qui sont composites et qui aident les pirates qui volent votre argent. AprĂšs tout, quels sont les diviseurs de ces nombres composites? Ils peuvent ĂȘtre suffisamment petits pour qu'un attaquant ouvre facilement un Ă©change de donnĂ©es cryptĂ©es.

Rappelez-vous maintenant pourquoi les pseudo-nombres premiers peuvent apparaĂźtre. Ces nombres ont de courtes pĂ©riodes qui se rĂ©pĂštent plusieurs fois au cours de la pĂ©riode complĂšte. N - 1 par consĂ©quent, ils peuvent parfois «s'intĂ©grer» et s'intĂ©grer un nombre entier de fois dans une pĂ©riode complĂšte. Ainsi, par exemple, le nombre 25 a une pĂ©riode de 4 pour le systĂšme numĂ©rique avec la base 7. N - 1 pour 25 est 24, essayez de diviser: 24/4 = 6. Autrement dit, cette pĂ©riode est prĂ©sentĂ©e un nombre entier de fois dans une pĂ©riode complĂšte. Ce fait peut ĂȘtre vĂ©rifiĂ© par la formule ci-dessus pour raccourcir la pĂ©riode, mais en tenant compte du fait que a et b sont les mĂȘmes dans ce cas. La pĂ©riode maximale possible sera de 24-4 = 20, ici 24 est le nombre total de rĂ©sidus, 4 est le nombre de rĂ©sidus qui sont des multiples de 5. Mais la pĂ©riode n'est pas toujours le maximum, et toutes les autres options peuvent ĂȘtre obtenues en divisant complĂštement la pĂ©riode maximale. 20 est divisĂ© par 2,4,5,10, et juste en divisant 20 par un nombre de la liste ci-dessus, nous obtenons une pĂ©riode de 4, ce qui nous donne Ă  la fin de la pĂ©riode complĂšte N - 1 unitĂ©. Et lors de la vĂ©rification de la simplicitĂ©, seules les valeurs Ă  la position sont vĂ©rifiĂ©es N - 1 , c'est-Ă -dire la derniĂšre valeur de la pĂ©riode complĂšte. Et pour 25, il est Ă©gal Ă  1, ce qui est un signe de la simplicitĂ© du nombre. Bien qu’en fait un signe clair de simplicitĂ©, c’est quand, pour toutes les bases des systĂšmes numĂ©riques, moins N , la derniĂšre valeur de la pĂ©riode complĂšte est Ă©gale Ă  un. Mais il n'y a aucun moyen de vĂ©rifier tous les systĂšmes numĂ©riques pour les grands nombres, donc des nombres pseudo-simples apparaissent qui sont parfois utilisĂ©s mĂȘme en cryptographie, ce qui augmente la vulnĂ©rabilitĂ© de nos finances.

Comment Ă©liminer l'influence des pseudo-nombres premiers? En principe, c'est simple - vous pouvez vĂ©rifier les pĂ©riodes pour tous les systĂšmes numĂ©riques, mais pour cette opĂ©ration pour les grands nombres, il n'y aura pas assez de temps. Par consĂ©quent, nous irons dans l'autre sens. Et le chemin est Ă©galement simple (au sens littĂ©ral - il utilise d'autres nombres premiers). Nous avons vu que de courtes pĂ©riodes peuvent s'adapter Ă  une pĂ©riode complĂšte un nombre entier de fois, et cela nous donne des nombres pseudo-simples. Mais qu'est-ce qui nous empĂȘche de prendre et d'annuler ces lundis? Oui, en gĂ©nĂ©ral, rien n'empĂȘche.

Pour de courtes pĂ©riodes, la pĂ©riode complĂšte ( N - 1 ) doit ĂȘtre divisĂ© en plusieurs diviseurs. Donc pour le nombre 25, la pĂ©riode complĂšte 24 est divisĂ©e en 2, 3, 4, 6, 8, 12. Il y a tellement de possibilitĂ©s de pĂ©nĂ©trer dans le territoire protĂ©gĂ© des nombres pseudo-simples. Nous avons donc juste besoin de prendre un prime comme une pĂ©riode complĂšte, car il ne se divise en rien du tout et nous sauve donc automatiquement de l'Ă©lĂ©ment ennemi. Certes, il y a un «mais» - nous avons besoin de nombres premiers, et ils sont connus pour ĂȘtre impairs (sauf pour une exception - 2), ce qui signifie que si N - 1 simple alors lui-mĂȘme N cela ne peut plus ĂȘtre simple. Par consĂ©quent, nous devrons admettre la possibilitĂ© de l'apparition de pĂ©riodes incomplĂštes. Pourquoi est-ce mauvais? Comme nous l'avons vu plus haut, la pĂ©riode complĂšte garantit la simplicitĂ© du nombre, mais nous n'avons pas encore prouvĂ© la pĂ©riode incomplĂšte. Nous devons donc prouver ce moment.

La preuve est assez simple - pour le composĂ© N durĂ©e N - 1 deux fois, obtenu dans un systĂšme numĂ©rique qui n'est pas un multiple des diviseurs de N, n'a que deux rangĂ©es de rĂ©sidus, et aucun d'entre eux ne doit contenir des nombres qui sont des multiples des diviseurs de N N (NumĂ©ros "interdits"). Si au moins un Ă©lĂ©ment est exclu d'une rangĂ©e de rĂ©sidus, alors le second diminue automatiquement du mĂȘme montant (aprĂšs tout, une rangĂ©e est Ă©gale Ă  une autre multipliĂ©e par un nombre qui n'est pas dans le premier). Donc, s'il y a des diviseurs dans le nombre N , nous obtenons une durĂ©e totale plus courte de deux pĂ©riodes avec tous les soldes «autorisĂ©s» que la valeur de la pĂ©riode complĂšte et ainsi dĂ©plaçons l'unitĂ© de sa place Ă  la fin de la pĂ©riode complĂšte, garantissant ainsi l'absence de pseudo-simplicitĂ©. Mais le nombre de restes de diviseurs multiples peut-il ĂȘtre tel qu'il donne exactement la moitiĂ© ou le tiers de la pĂ©riode complĂšte? En effet, nous recevrions alors, par exemple, les deux tiers des soldes «autorisĂ©s» (deux rangĂ©es) et un tiers des soldes «interdits», et au total - la pĂ©riode complĂšte. Mais pour obtenir un tiers, nous devons garantir la divisibilitĂ© de toute la pĂ©riode ( N - 1 ) par 3, que l'on peut assez facilement exclure - prendre un nombre premier, le multiplier par deux et en ajouter un au rĂ©sultat - le tour est jouĂ©, nous avons la garantie d'exclure la pseudo-simplicitĂ©. Avec lui, le nombre de diviseurs divisibles par les diviseurs ne peut pas ĂȘtre Ă©gal au tiers de la pĂ©riode complĂšte, car il ne peut pas diviser par trois pĂ©riodes complĂštes. Il reste l'option avec la moitiĂ© du reste qui est un multiple des diviseurs N . Cette option est Ă©liminĂ©e un peu plus difficile, il y aura donc une lĂ©gĂšre digression ci-dessous.

Calcul de la période ou de tous les nombres - Les enfants de Mersenne


La pĂ©riode de n'importe quel nombre peut ĂȘtre calculĂ©e. Dans le cas le plus simple, le calcul se fait en divisant simplement le coin 1 $ / N $ jusqu'Ă  ce que nous rencontrions un reste Ă©gal Ă  un (dans le systĂšme numĂ©rique, pas un multiple des diviseurs N ) Mais pour un grand nombre, c'est irrĂ©aliste. Par consĂ©quent, il est nĂ©cessaire de dĂ©river une formule pour calculer la pĂ©riode. Et une telle formule existe, mais pas dans sa forme idĂ©ale, quand nous avons un nombre Ă  l'entrĂ©e et une pĂ©riode Ă  la sortie. La formule est:

N = f r a c b m + n + 1 - 1 b n + k 



Ici N - numĂ©ro enquĂȘtĂ©, b - la base du systĂšme de numĂ©rotation utilisĂ© (base), m - degrĂ© maximum b Ă  laquelle le rĂ©sultat de l'exponentiation est moins N (en d'autres termes, l'indice de niveau supĂ©rieur N dans le systĂšme numĂ©rique b ), n - distance de gauche Ă  droite dans une sĂ©rie de rĂ©sidus de l'indice m + 1 (Ă©gal au nombre de bits dans N ) Ă  un, k Est un certain coefficient entier.

Sortie de formule


Par la dĂ©finition de la formule, il est clair que (1) b m + 1 - N = x c'est-Ă -dire le premier degrĂ© b qui est plus grand N , vous permet de soustraire N et obtenez une diffĂ©rence dans le formulaire x . Il rĂ©sulte Ă©galement de la dĂ©finition que (2) x ∗ b n - k ∗ N = 1 ici k est un coefficient entier. Si vous multipliez(1)parb n et remplacerx ∗ b n Ă  sa valeur de(2), qui est Ă©gale Ă k N + 1 , alors on obtientb m + n + 1 = N ∗ b n + k N + 1 = N ∗ ( b n + k ) + 1 = > N = b m + n + 1 - 1b n + k .

Propriétés utiles


Comme nous pouvons le voir, en utilisant cette formule, vous pouvez obtenir des nombres avec une pĂ©riode connue. Certes, il y a une difficultĂ© - vous devez sĂ©lectionner un coefficientk , qui pour de grands nombres redevient quelque chose d'inatteignable. Mais la formule nous donne autre chose - nous voyons clairement comment tous les nombres sont formĂ©s. Oui, absolument tous les entiers positifs peuvent ĂȘtre obtenus par cette formule, car tous les nombres ont une pĂ©riode. Et fait intĂ©ressant, tous les nombres sont obtenus en divisant le nombre de Mersenne par l'un de ses diviseurs. Rappelons qu'un nombre de Mersenne est un nombre Ă©gal Ă 2 n - 1 .Dans la formule du numĂ©rateur, nous voyons une gĂ©nĂ©ralisation pour les nombres de Mersenne avec n'importe quelle base (y compris 2, bien sĂ»r). Et si nous nous intĂ©ressons aux nombres premiers, nous n'aurons pas besoin d'autres bases que 2.

Sachant que nous partageons Mersenne premier, il serait utile de pouvoir calculer la pĂ©riode des numĂ©ros est dans le cas de la division des nombres de Mersenne (souvenez - vous de la pĂ©riode de concept Ă©largi ici ). Mais ce qui est trĂšs remarquable, c'est que la formule de calcul de la pĂ©riode de Mersen coĂŻncide avec la formule de calcul d'une pĂ©riode du type1 / N . Eh bien, pour dĂ©river la formule de division des nombres de Mersenne, le mĂȘme principe est utilisĂ© que pour dĂ©river la formule de division 1 / N , Ă  l'exception de la formule de calcul de la valeur dans une sĂ©rie de rĂ©sidus avec indicen qui ressemble Ă  ceci -b n + 1 - 1b - 1 , et pour les nombres binaires, nous obtenons2 n + 1 1 .

Nous avons maintenant toutes les cartes en main et nous pouvons commencer le jeu en ouvrant les archers pseudo-simples dans les rangs des premiers.

Comme nous le savons Ă  partir de la sĂ©rie prĂ©cĂ©dente, lorsqu'elle est divisible, toute la pĂ©riode de Mersen d'un nombre doit correspondre au nombre de chiffres du nombre de Mersenne un nombre entier de fois. Par consĂ©quent, dans la formule ci-dessus, une solution en nombres entiers n'est possible que si le dĂ©nominateur a une pĂ©riode soit Ă©gale au numĂ©rateur soit plusieurs fois plus petite. Mais une pĂ©riode beaucoup plus courte nous donnera, y compris les diviseurs du nombre lui-mĂȘmeN , car siN divise le nombre de Mersenne, puis ses diviseurs divisent Ă©galement le nombre de Mersenne. Et c'est un point trĂšs important, car il en rĂ©sulte que les longueurs des pĂ©riodes des diviseurs N divisent la longueur de la pĂ©riodeN complĂštement. Autrement dit, si nous prenonsN est tel que sa pĂ©riode est Ă©gale Ă  la pĂ©riode du numĂ©rateur, alors tous les diviseursN sera en mĂȘme temps des diviseurs du nombre de Mersenne, et doit donc s'insĂ©rer dans la pĂ©riode etN et Mersenne numĂ©rote un nombre entier de fois.

Encore environ la moitié de la période


Rappelons maintenant que nous nous sommes arrĂȘtĂ©s sur la recherche d'un moyen de prouver que nous pouvons exclure le cas oĂč la moitiĂ© de la longueur d'une sĂ©rie de nombres rĂ©siduels est un multiple de ses diviseurs. Nous voulions prouver cela pour Ă©liminer les pseudo-nombres premiers lors du choix d'un nombre premier comme base pour construire la pĂ©riode du prochain nombre premier. Alors maintenant, nous savons que si le nombre construit a des diviseurs, alors leurs pĂ©riodes divisent toujours complĂštement la pĂ©riode du nombre construit. Ensuite, il nous reste Ă  vĂ©rifier quels diviseurs peuvent correspondre aux restrictions prĂ©cĂ©demment donnĂ©es sur le nombre construit. Et de telles restrictions - sa pĂ©riode est divisĂ©e uniquement en2 et plus( N - 1 ) / 2 . Par consĂ©quent, seuls les nombres avec des points peuvent ĂȘtre des diviseurs 2 et ( N - 1 ) / 2 . PĂ©riode 2 a un nombre2 , aucun autre nombre d'une telle pĂ©riode n'a plus. PĂ©riode2 ne correspond pas Ă  un nombre entier de fois( N - 1 ) / 2 , car( N - 1 ) / 2 est premier, donc la divisibilitĂ© en trois est exclue pour une telle pĂ©riode. Il n'y a donc qu'une seule possibilitĂ© - les sĂ©parateurs ont une pĂ©riode( N - 1 ) / 2 . Mais le nombre ne peut pas ĂȘtre infĂ©rieur ou Ă©gal Ă  sa pĂ©riode, donc la valeur minimale pour les diviseurs est ( N - 1 ) / 2 + 1 . Si nous multiplions deux diviseurs minimaux, nous obtenons - ( N - 1 ) 2 / 4 + ( N - 1 ) + 1 = ( N 2 - 2 N + 1 + 4 N ) / 4 = ( N 2 + 2 N + 1 ) / 4 , cette valeurdoit pas ĂȘtre plusN , parce que nous parlons de diviseursN . Ensuite, nous obtenons l'inĂ©galitĂ© ( N 2 + 2 N + 1 ) / 4 ≀ N = > N 2 - 2 N + 1 ≀ 0 . Cette inĂ©galitĂ© peut ĂȘtre nĂ©gative ou Ă©gale Ă  zĂ©ro uniquement pour N = 1 , par consĂ©quent, pour tous les nombres ainsi construits, la pseudo-simplicitĂ© est exclue si le nombre rĂ©sultant est supĂ©rieur Ă 1 . Eh bien, pour de plus petits nombres, nous pouvons tester la simplicitĂ© mĂȘme dans l'esprit.

Maintenant, il y a deux options - le nouveau nombre est un nombre premier, ce dont nous avions besoin, ou c'est un nombre composite, puis sa pĂ©riode ne correspond pas Ă  un nombre entier de fois dans une pĂ©riode complĂšte, et donc ce nombre peut ĂȘtre facilement vĂ©rifiĂ© pour plus de simplicitĂ© en calculant la derniĂšre valeur dans une sĂ©rie complĂšte de rĂ©sidus. Autrement dit, le nombre construit peut ĂȘtre facilement vĂ©rifiĂ© avec des tests de simplicitĂ© probabiliste standard, et ce qui est important, le rĂ©sultat du test ne sera pas probabiliste, mais garanti. Donc, au final, nous nous sommes dĂ©barrassĂ©s de la malĂ©diction de la pseudo-simplicitĂ©, qui met la pression sur tous les tests probabilistes.

Mais bien sûr, la vie serait chérie si tous les problÚmes étaient résolus si simplement. En éliminant la pseudo-simplicité, nous n'avons pas exclu les numéros qui ne sont cachés à personne et qui ne sont masqués sous rien. Et avec eux, il y a un problÚme de plus - pour le moment, nous ne pouvons vérifier un terme arbitraire dans la séquence de résidus qu'en élevant à une puissance et en prenant ensuite le reste. Mais cette méthode est trÚs lente. Plus précisément, il est assez rapide pour les nombres utilisés en cryptographie, mais il ne convient pas pour trouver de grands nombres premiers à la maison, car il nécessite de nombreuses années de calcul d'un ordinateur domestique normal, ce qui ne nous permet pas d'obtenir 400k $ (comme illustré ici ).

NĂ©anmoins, presque tout est prĂȘt pour le calcul des nombres premiers cryptographiques. Bien que notre vieil ami reste - le maximalisme. Il demande - si vous pouvez utiliser une pĂ©riode ( N - 1 ) / 2 , ce qui empĂȘche l'utilisation des rĂšgles (N−1)/4,(N−1)/6,(N−1)/8 etc.? Et il s'avĂšre qu'avec la prudence requise - rien n'empĂȘche!

De la mĂȘme maniĂšre qu'avec la pĂ©riode (N−1)/2 pour la pĂ©riode (N−1)/4 nous sommes en mesure de fixer une borne infĂ©rieure en multipliant un nombre premier par 4 et en ajoutant 1. Ensuite, nous nous garantissons de pseudo-simple avec des pĂ©riodes infĂ©rieures Ă  (N−1)/4 . Par consĂ©quent, il reste Ă  considĂ©rer la possibilitĂ© d'occurrences pseudo-simples avec un multiple de pĂ©riode de 4, 3, 2 (1 est exclu pour les composants, comme indiquĂ© ci-dessus). D'aprĂšs la formule de calcul du nombre par pĂ©riode, on voit que la pĂ©riode du dividende doit ĂȘtre Ă©gale au plus petit commun multiple de ses diviseurs, ce qui implique que la pĂ©riode possible du nombre N devrait non seulement tenir un nombre entier de fois N−1 (sinon il n'y aura pas de pseudo-simplicitĂ©), mais contient Ă©galement un nombre entier de pĂ©riodes de sĂ©parations. Ainsi, le nombre de diviseurs possibles d'un nombre pseudo-premier est fortement limitĂ©. Puisque la pĂ©riode d'un nombre quelconque ne peut pas ĂȘtre plus longue N−1 , puis pour un Ă©ventuel diviseur N donnant Ă  la suite de la division 3, la pĂ©riode ne peut pas ĂȘtre plus longue N/3−1 , en outre, nous tenons compte du fait que la pĂ©riode de 3 est 2. N/3 doit ĂȘtre Ă©trange car il est Ă©trange N . Il rĂ©sulte de ce qui prĂ©cĂšde que la pĂ©riode paire N / 3-1 est le plus petit multiple commun avec une pĂ©riode 2 du nombre 3, ce qui signifie que la pĂ©riode possible d'un N potentiellement pseudo-simple doit ĂȘtre Ă©gale Ă  la pĂ©riode du nombre N/3 . Au total, il y a une valeur de la pĂ©riode N pour laquelle la pseudo-simplicitĂ© est possible, cette (N−1)/4 . Pour les autres valeurs, soit N/3 trop peu ou sa pĂ©riode (et avec elle la pĂ©riode N ) ira dans la zone interdite ci-dessous (N−1)/4 . La mĂȘme histoire avec des nombres impairs, moins N/3 mais leurs rĂšgles ne peuvent pas ĂȘtre plus longues (N−1)/4 et, par consĂ©quent, tous sont simplement exclus de l'examen. Montrez maintenant que N/3 ne peut pas avoir de rĂšgles (N−1)/4 , ce qui signifie qu'il ne peut pas diviser entiĂšrement la pĂ©riode entiĂšre. Rappelons d'abord la formule m=a+b−2 , ce qui nous donne le nombre de rĂ©sidus de diviseurs multiples pour un nombre divisible uniquement par a et b . Dans notre cas N censĂ© ĂȘtre divisĂ© en N/3 et par 3, tous les autres diviseurs sont exclus, nous obtenons donc - m=N/3+3−2=N/3+1 . Maintenant, Ă  partir de la pĂ©riode complĂšte, vous devez soustraire les valeurs «interdites», qui seront N/3+1 , puis diviser par 4. Nous obtenons la pĂ©riode de travail possible 3 $ * N / 3 $ : p=(N−1−N/3−1)/4=N/6−1/2 moins (N−1)/4 c'est-Ă -dire une pĂ©riode de temps (N−1)/4 impossible en raison de la nĂ©cessitĂ© de prendre en compte les rĂ©sidus «interdits», ce qui conduit toutes les pĂ©riodes pseudo-simples possibles Ă  la rĂ©gion interdite (moins (N−1)/4 ) Cela signifie que cette situation nous garantit que le nombre construit n'est pas pseudo-simple, et donc nous pouvons Ă  nouveau ĂȘtre sĂ»r des rĂ©sultats d'un test de simplicitĂ© probabiliste ultĂ©rieur.

De mĂȘme, et compte tenu de la divisibilitĂ© de la pĂ©riode complĂšte, on peut obtenir les mĂȘmes rĂ©sultats pour d'autres valeurs. Mais si nous voulons obtenir des nombres premiers cryptographiques de cette façon, alors en multipliant par 2,4,6, nous augmenterons la taille du nombre pendant trĂšs longtemps, il est donc logique de regarder dans la direction d'une autre option - la multiplication de deux nombres premiers. Si nous multiplions un nombre premier par un autre, nous obtenons un nombre impair, nous devons donc Ă©galement multiplier par 2 pour obtenir une pĂ©riode entiĂšre paire et un candidat impair pour le nombre premier. La pĂ©riode complĂšte dans ce cas sera divisĂ©e en 2 $, a, b, 2a, 2b, ab $ oĂč a et b Sont des nombres premiers. Nous devons maintenant prouver que les pĂ©riodes indiquĂ©es ne donneront pas de pseudo-simplicitĂ©, ou trouver des signes nous avertissant de la prĂ©sence de pseudo-simplicitĂ©. Notez simplement que si la pĂ©riode est Ă©gale Ă  2 $ * a * b $ , alors le nombre sera premier (comme indiquĂ© ci-dessus). Il est Ă©galement montrĂ© ci-dessus qu'un nombre de demi-pĂ©riode ne peut pas ĂȘtre pseudo-simple, donc une pĂ©riode de longueur ab peut ĂȘtre exclu. Bien que pour ĂȘtre complet, vous pouvez vĂ©rifier la pĂ©riode ab des moyens alternatifs. Donc, si la pĂ©riode est ab , puis Ă©tant donnĂ© que a et b simple, il devient clair que le plus petit commun multiple des pĂ©riodes de diviseur N ne peut ĂȘtre Ă©gal ab , tandis que les pĂ©riodes des sĂ©parateurs peuvent ĂȘtre Ă©gales Ă  ab les deux ou un a et un autre b . Puisque la pĂ©riode est toujours infĂ©rieure au nombre lui-mĂȘme, alors (ab+x)∗(ab+y) il y aura Ă©videmment plus 2ab $ + 1 $ . Par consĂ©quent, la pseudo-simplicitĂ© n'est pas possible avec une telle pĂ©riode. Il reste donc Ă  vĂ©rifier les pĂ©riodes 2 $, a, b, 2a, 2b $ . 2 est infĂ©rieur Ă  la pĂ©riode minimale possible pour tous les nombres, plus de 3, par consĂ©quent, nous excluons une telle pĂ©riode. Supposons maintenant que le nombre construit est divisĂ© par m et n , puis avec l'Ă©galitĂ© de la pĂ©riode N sens a , leurs pĂ©riodes seront Ă©galement Ă©gales a , car il s'agit du seul multiple le moins commun pour deux nombres, car a pas divisĂ© en rien. Il s'ensuit que (a+x)∗(a+y)=N=ab∗2+1 oĂč a+x=m - le premier facteur possible avec une pĂ©riode a et a+y=n - deuxiĂšme. Suivant: a2+ax+ay+xy=2ab+1=>a2+ax+ay+(ka+r)=2ab+1=>a+x+y+k=(2ab+1−r)/a . Ici r peut ĂȘtre Ă©gal Ă  un seul, sinon l'entier ne fonctionnera pas Ă  gauche. Ensuite: x+y+k=2b−a , d'oĂč il rĂ©sulte que si a geq2b , puis pseudo-simple avec un point a ne peut pas ĂȘtre. Reste Ă  vĂ©rifier la pseudo-simplicitĂ© Ă  a<2b , ce qui peut ĂȘtre fait en vĂ©rifiant les valeurs dans la sĂ©rie de rĂ©sidus Ă  la position a s'il y a 1, un tel nombre peut ĂȘtre pseudo-simple et doit ĂȘtre exclu des opĂ©rations ultĂ©rieures. Raisonnement pour b complĂštement analogue, ce qui signifie la nĂ©cessitĂ© de vĂ©rifier l'Ă©galitĂ© de l'unitĂ© et de son reste, Ă  condition b<2a .

Pour la pĂ©riode 2a nous avons: 4a2+2ax+2ay+xy=2ab+1=>4a2+2ax+2ay+(ka+r)=2ab+1=>4a+2x+2y+k=(2ab+1−r)/a=>2 x + 2 y + k = 2 b - 4 a . Nous obtenons cela pour 4 a g e q 2 b  (ou de maniĂšre Ă©quivalente - 2 a g e q b  ) encore une fois, il ne peut y avoir de simplicitĂ©, mais si 2 a < b , alors vous devez vĂ©rifier le solde de la position 2 a . De mĂȘme pour b - vĂ©rifier si 2 milliards $ <a $ . Au total, on obtient pour un et pour b la nĂ©cessitĂ© de vĂ©rifier uniquement les Ă©lĂ©ments de campagne 2 a et 2 b parce que les rĂšgles un et b va se rĂ©pĂ©ter juste en position 2 a et 2 b . La vĂ©rification n'est effectuĂ©e que dans les conditions ci-dessus, ce qui doublera presque le processus lors de la vĂ©rification de grandes valeurs un ou b , car pour eux ils doivent a g e q 2 b  avec le schĂ©ma de gĂ©nĂ©ration simple ci-dessous, et les valeurs infĂ©rieures seront vĂ©rifiĂ©es trĂšs rapidement en raison de leur petite taille.

Ainsi, les fondements théoriques ont été montrés ci-dessus pour pouvoir générer des nombres premiers garantis pour des domaines critiques tels que la cryptographie.

De plus, une voie est ouverte pour vĂ©rifier la simplicitĂ© d'un nombre arbitraire, Ă  condition que les diviseurs de sa pĂ©riode entiĂšre soient trouvĂ©s ( N - 1 ) Ainsi, pour des nombres premiers <126 000 000, le nombre de «nombres premiers multipliĂ©s» appartenant Ă  la classe est de 676625, avec le nombre total de nombres premiers 7163812, ce qui nous donne un peu moins de 9,5%. Pour les nombres premiers jusqu'Ă  un milliard, nous avons 3,49% appartenant Ă  la classe 2p + 1, 1,8116% de la classe 4p + 1, 2,4709% de la classe 6p + 1 et seulement 7,7746%, oĂč p est un nombre premier. Certes, il convient de noter que la dĂ©composition de la pĂ©riode complĂšte des grands nombres est trĂšs difficile. Dans ce cas, vous pouvez proposer un contrĂŽle rĂ©cursif, ce qui augmentera lĂ©gĂšrement la taille des nombres disponibles pour le contrĂŽle, mais en mĂȘme temps rĂ©duira considĂ©rablement la proportion de nombres passant un tel contrĂŽle, car si le coefficient dĂ©terminant l'appartenance aux classes de nombres premiers rĂ©cursifs est pris Ă©gal Ă  0,2, alors dĂ©jĂ  dans le deuxiĂšme contrĂŽle, nous ont seulement 0,04, soit 4% du nombre total de nombres premiers. NĂ©anmoins, dans certains cas, cette approche peut ĂȘtre bĂ©nĂ©fique.

RĂ©sultats pratiques


Le gĂ©nĂ©rateur lui-mĂȘme, bien sĂ»r, a Ă©tĂ© Ă©crit et testĂ©, car la complexitĂ© y est minime. Au cours de la vĂ©rification, il s'est avĂ©rĂ© que l'algorithme suivant serait pleinement fonctionnel:

Nous obtenons, par exemple, 1000 nombres premiers initiaux, qui peuvent ĂȘtre gĂ©nĂ©rĂ©s Ă  l'aide du tamis d'EratosthĂšne ou simplement tĂ©lĂ©chargĂ©s Ă  partir d'ici . Ensuite, nous multiplions chaque valeur par chacune restante et n'oubliez pas de multiplier par deux, puis d'ajouter une. Le candidat rĂ©sultant est souvent divisĂ© par 3, car les nombres premiers ont une caractĂ©ristique spĂ©cifique similaire Ă  la prĂ©sence d'une charge sur les particules en physique. Les personnes simples avec la mĂȘme «charge» sont repoussĂ©es et avec diffĂ©rentes, elles sont attirĂ©es. Dans ce cas, la «charge» est le reste de la division par 3. Autrement dit, si le reste de la division par 3 est le mĂȘme pour les deux nombres premiers, le nouveau nombre premier ne fonctionnera pas, car il sera divisĂ© par 3. Et si le reste est diffĂ©rent, alors nous pouvons obtenir le bon candidat Ă  simple. De plus, tous les simples obtenus par multiplication sont «synchronisĂ©s», c'est-Ă -dire qu'ils reçoivent le mĂȘme reste Ă©gal Ă  2. Par consĂ©quent, il est inutile de les multiplier Ă  nouveau par eux-mĂȘmes. Donc, pour obtenir de nouveaux nombres premiers, nous devons filtrer la partie du 1000 initial pour laquelle le module du triple (le reste de la division par 3) est 1. Ainsi, aprĂšs la premiĂšre multiplication de tous avec tout le monde, nous grandissons dans la quantitĂ© de nombres qui sont dĂ©jĂ  inutiles pour se multiplier les uns avec les autres par consĂ©quent, pour augmenter encore la taille (Ă  celle utilisĂ©e en cryptographie), nous devons multiplier encore et encore les nombres premiers obtenus par les nombres «chargĂ©s de maniĂšre opposĂ©e» prĂ©cĂ©demment sĂ©lectionnĂ©s. AprĂšs multiplication et ajout d'une unitĂ©, nous effectuons des vĂ©rifications selon le critĂšre de possibilitĂ© de pseudo-simplicitĂ© et si le critĂšre est satisfait, nous vĂ©rifions le reste en position 2a pour chaque candidat. S'il y a 1, alors le candidat est rejetĂ©. Ensuite, chaque candidat est vĂ©rifiĂ© par le test probabiliste habituel, c'est-Ă -dire que la valeur est calculĂ©e dans la sĂ©rie de rĂ©sidus Ă  la position ( N - 1 ) / 2 si c'est 1 ou N - 1 , alors devant nous est un nombre premier garanti.

Lors de la gĂ©nĂ©ration, il faut garder Ă  l'esprit qu'Ă  chaque itĂ©ration, une augmentation du nombre de nombres premiers gĂ©nĂ©rĂ©s est obtenue, c'est-Ă -dire que le coefficient de multiplication pour 1000 nombres premiers initiaux est bien plus que l'unitĂ©. Par consĂ©quent, pour obtenir des nombres premiers cryptographiques, il est nĂ©cessaire de limiter la gĂ©nĂ©ration, sinon cela prendra beaucoup de temps et il n'y aura peut-ĂȘtre pas assez de mĂ©moire. Dans le mĂȘme temps, il ne faut pas rĂ©duire l'ensemble initial de simples, car la gĂ©nĂ©ration doit ĂȘtre aussi alĂ©atoire que possible, de sorte que, connaissant son algorithme, l'attaquant ne prĂ©dirait pas les valeurs rĂ©sultantes. Pour cela, il est nĂ©cessaire de mettre en Ɠuvre un mĂ©canisme de coupure des branches de l'arbre de gĂ©nĂ©ration, qui permet Ă  chaque fois d'obtenir des simples simples situĂ©s assez loin des prĂ©cĂ©dents. Et bien sĂ»r, couper l'excĂ©dent accĂ©lĂšre considĂ©rablement le processus.

Le temps d'exécution du test dépend du nombre de candidats générés. Chacun des candidats passe un test de probabilité, ce qui ralentit le plus la génération. En tests pour obtenir quelques centaines de portée simple 2 $ ^ {900} $ - 2 1200 5 à 20 minutes ont été consacrées. Cette différence de temps s'explique par différentes maniÚres dont l'algorithme passe dans l'arbre de génération. Donc, initialement, la génération est limitée à environ 10 nombres, mais à mesure que la taille cryptographique approche, la génération s'estompe en raison d'une réduction significative du coefficient de multiplication avec un nombre croissant. Par conséquent, il est nécessaire d'augmenter le nombre de nombres intermédiaires intermédiaires, mais il est difficile de dire à quel point il est spécifique, et donc une simple augmentation de la quantité autorisée d'un facteur deux est utilisée pour le limiter avec une augmentation de la taille du nombre et un excÚs d'un seuil approximatif. En conséquence, dans les limites des limitations, le nombre de nouveaux simples peut flotter et ainsi faire une différence significative dans le temps de génération total.

Voici le texte d'une procĂ©dure Java qui gĂ©nĂšre des nombres premiers. Naturellement, il ne satisfait pas aux exigences cryptographiques qui vont bien au-delĂ  du code du programme et concernent principalement des problĂšmes d'organisation. Dans la partie purement logicielle, la procĂ©dure n'implĂ©mente pas le mĂ©canisme de rognage des branches de l'arbre de gĂ©nĂ©ration, Ă  l'exception de la restriction la plus simple. NĂ©anmoins, comme exemple de mise en Ɠuvre de l'algorithme de gĂ©nĂ©ration, le programme peut vous aider avec quelque chose.

Les paramĂštres d'entrĂ©e sont la liste initiale de simples et PrintWriter pour enregistrer le rĂ©sultat dans un fichier. AprĂšs l'achĂšvement de l'algorithme, le fichier contiendra tous les produits des nombres premiers gĂ©nĂ©rĂ©s avec ces nombres initiaux qui ont un module de trois Ă©gal Ă  un. Le rĂ©sultat peut ĂȘtre vĂ©rifiĂ© Ă  l'aide de services en ligne qui implĂ©mentent la factorisation des nombres, mais il faut comprendre qu'ils peuvent utiliser un test probabiliste de simplicitĂ© avant d'effectuer la factorisation, et donc, pour vĂ©rifier l'approche proposĂ©e, ils deviennent inutiles (car tous les nombres sont dĂ©jĂ  vĂ©rifiĂ©s par un test probabiliste). Mais un certain nombre d'entre eux commencent immĂ©diatement Ă  factoriser le nombre proposĂ© en facteurs, de tels sites peuvent donner une confiance supplĂ©mentaire dans l'exactitude de la mĂ©thode proposĂ©e.

public static void generatePrimes(List<Integer> primes, PrintWriter pw) { List<BigInteger> mod3_1 = new ArrayList<BigInteger>(); List<BigInteger> l = new ArrayList<BigInteger>(); BigInteger three=BigInteger.valueOf(3), two=BigInteger.valueOf(2); for (int k=0;k<primes.size()-1;k++) { BigInteger seed=BigInteger.valueOf(primes.get(k)); BigInteger s2=seed.shiftLeft(1); BigInteger r0=seed.remainder(three); if (r0.intValue()==1) mod3_1.add(seed); for (int i=k+1;i<primes.size();i++) { BigInteger p=BigInteger.valueOf(primes.get(i)); BigInteger r=p.remainder(three); if (r.intValue()==r0.intValue()) continue; // divisible by 3 else addIfPrime(p,seed,s2,two,l); } } List<BigInteger> ps=l; do { System.out.println("found "+l.size()+", bits="+l.get(0).bitLength()); l=new ArrayList<BigInteger>(); for (int k=0;k<ps.size();k++) { BigInteger seed=ps.get(k); BigInteger s2=seed.shiftLeft(1); for (int i=0;i<mod3_1.size();i++) addIfPrime(mod3_1.get(i),seed,s2,two,l); int n=100000; // change following to adjust for required bit count if (l.size()>0) if (l.get(0).bitLength()<700) n=10; else if (l.get(0).bitLength()<800) n=20; else if (l.get(0).bitLength()<900) n=40; if (l.size()>n) break; } ps=l; for (int i=0;i<l.size();i++) pw.println(l.get(i)); pw.flush(); } while (l.size()>0); System.out.println("Done"); } private static void addIfPrime(BigInteger a, BigInteger b, BigInteger b2, BigInteger two, List<BigInteger> l) { BigInteger a2=a.shiftLeft(1), fp=b.multiply(a2), n=fp.add(BigInteger.ONE); BigInteger r=null; if (a2.compareTo(b)<0) r=two.modPow(a2,n); // 2a<b else if (a.compareTo(b2)<0) r=two.modPow(a,n); // a<2b if (r!=null && r.compareTo(BigInteger.ONE)==0) return; r=null; if (b2.compareTo(a)<0) r=two.modPow(b2,n); // 2b<a else if (b.compareTo(a2)<0) r=two.modPow(b,n); // b<2a if (r!=null && r.compareTo(BigInteger.ONE)==0) return; r=two.modPow(fp.shiftRight(1),n); if (r.compareTo(BigInteger.ONE)!=0) return; l.add(n); } 

Eh bien, maintenant que vous (enfin, presque) savez tout sur la gĂ©nĂ©ration de nombres premiers, peut-ĂȘtre que vos intĂ©rĂȘts iront au-delĂ  de la cryptographie seule et il deviendra intĂ©ressant pour vous d'Ă©tudier la thĂ©orie des nombres, car, comme mentionnĂ© ci-dessus, elle est disponible pour les Ă©lĂšves de cinquiĂšme annĂ©e, mais en mĂȘme temps, cela vous permet Ă©galement de trouver indĂ©pendamment de vrais diamants sans attendre l'aide de mathĂ©maticiens sĂ©rieux.

Source: https://habr.com/ru/post/fr470159/


All Articles