La Formula Matematica

Analizzeremo l'intera sequenza nella creazione del semiprimo, la chiave, e l'individuazione del campo

Calcolo il prodotto di np aggiungendo 1 ai due coefficienti: Questo mi consentirà di identificare il campo
NOTA: L'aggiunta di 1 ai due coefficienti è fondamentale. Senza questa aggiunta verrebbe restituito il valore zero

$$\textcolor{blue}{(a^{Es}+1)*(b^{Es1}+1) = np}$$

Creo la chiave C.

$$ \textcolor{blue}{C = b^{Es1}-1} $$

Identifico L'intervallo dove GC57 può fattorizzare senza implementare.
La parentesi quadra indica la parte intera della divisione.

Per praticità useremo B maiuscolo per indicare il coefficiente bEs1
e I maiuscolo per indicare il campo

$$ \textcolor{blue}{{I =[ \frac{B-1}{(np \mod (B-1))}}]*2} $$

Seleziona un numero a caso all'interno di I, sia per j1 che per j2

$$ \textcolor{blue}{j1 = \text{randint}(1, I)} $$ $$ \textcolor{blue}{j2 = \text{randint}(1, I)} $$

Individuiamo due numeri primi

$$ \textcolor{blue}{p = \text{nextprime}(a^{Es} + j1)} $$ $$ \textcolor{blue}{q = \text{nextprime}(b^{Es1} + j2)} $$

Moltiplichiamo tra di loro i due numeri primi trovati p e q e otterremo il semiprimo

Calcolo il semiprimo S

$$ \textcolor{blue}{pq = S} $$

Applico la proprietà "C" del GC57 e restituirà il Fattore p

$$ \textcolor{blue}{{Mcd(S,S\mod C)} = p} $$

Ecco un esempio su numeri reali di dimensione limitata

7637116 = 1339231440512020340072258504092954549323815316786608252418261169326660703929921

87621122 = 54624996571261482756239098007192320213090196007624739699729344668072147955685488879704701119224902073234626482044798624979760473721

C=54624996571261482756239098007192320213090196007624739699729344668072147955685488879704701119224902073234626482044798624979760473720

I= 407883170293381365060413251688546614204855537816350940

j1= 5656171694508193853299866782255934393526915800518732

j2= 29219278825175008343630905512310813466943190786662532

S=73155512846094687489036515685517466932714366370595924966435044057244684100831976531373532919311462931621061674766168335705072773833025416280948061110023418176703652355979144276396326990410631472467883833317209

Numeri primi trovati con MCD(S,S mod C)

p=1339231440512020340072258509749126243832009170086475034674195562853576504448653

q=54624996571261482756239098007192320213090196007624739699729344668072147955685518098983526294233245704140138792858265568170547136253

Quello che segue è il listato che ho utilizzato per questo test.
Ogni volta che verrà mandato in esecuzione produrrà numeri sempre diversi
in quanto la parte random su x e y produrranno sempre numeri diversi.
In oltre, in questo script, si può modificare il parametro rip=1 per testare
i vari contenitori come descritto nella pagina principale


# * GC57 test contenitore chiave 1
from math import gcd,log
from random import randint, seed
import time
from gmpy2 import next_prime as nprime
from gmpy2 import is_prime as iprime
# **** imposto il seme di ricerca random
T=int(time.time())
seed(T)

# definisco il ciclo di ripetizione per entrambi i cicli inseriti
rip=1

# **** imposto due numeri primi
ps = 76371
qs = 876211

# **** imposto gli esponenti
p=ps**16
q=qs**22
# **** Calcolo la chiave e l'intervallo
print("---------------------------------------------------------------------")
# chiave=q-1
nn=(p+1)*(q+1)
#esp = int(log(nn, qs)) // 2
#chiave = qs**esp
chiave = q - 1
print("chiave =",chiave)
campo=(chiave//(((p+1)*(q+1))%chiave))*2
print("campo =",campo)
print("base p =",p)
print("base q =", q)
# **** Imposto variabili progressione
pc=p*q//campo
v1=0
v2=v1+1
# **** identifico il numero primo
for i in range(rip):
trovato=0
p_campo = randint(campo*v1, campo*v2)
q_campo = randint(campo*v1, campo*v2)
n1 =nprime (p + p_campo)
n2= nprime(q + q_campo)

n=n1*n2
for k in range(rip):
    r=gcd(n,(n%chiave)+chiave*v1)
    if r!=1:
        print("---------------------------------------------------------------------")
        print()
        print("divisore 1 : ", r," ",iprime(r))
        print("divisore 2 : ", n//r," ",iprime(n//r))
        print("contenitore k : ", i)
        print("contenitore v1 : ",v1)
        print()
        print("X =",n1-p)
        print("Y =",n2-q)
        print()
        print("Numero composto analizzato: ",n)
        print("Controanalisi numero composto: ",r*(n//r))
        print()
        trovato=1
        break
if trovato==0:
    print("attenzione: nessun divisore trovato per il contenitore :",v1)
    break
v1+=1
v2+=1