[C] Un piccolo aiuto sulla complessità computazionale
Il mio primo algoritmo funzionante per la decodifica di un RSA=p*q
dove RSA,p,q sono nella forma 6h+1 (in realtà fattorizza anche Rsa=6h+5 ma non è proprio sempre efficiente ma è facilmente ampliabile) e tenendo conto che in un RSA di solito p/q<2.
volevo chiedervi qual'è la complessità computazionale ?
dove RSA,p,q sono nella forma 6h+1 (in realtà fattorizza anche Rsa=6h+5 ma non è proprio sempre efficiente ma è facilmente ampliabile) e tenendo conto che in un RSA di solito p/q<2.
volevo chiedervi qual'è la complessità computazionale ?
#include <stdio.h> #include <stdlib.h> #include <math.h> int fattorizza_RSA_sei_h_1_sei_h_1(int *cicli,int RSA); int main(){ int RSA=0; int cicli=0; int jolly; int fattore=1; scanf("%d",&RSA); printf("\n%d\n",RSA); jolly=(sqrt(RSA/2))/6; fattore=fattorizza_RSA_sei_h_1_sei_h_1(&cicli,RSA); printf("\n%d è diviso da %d in %d cicli\n",RSA,fattore, cicli); } fattorizza_RSA_sei_h_1_sei_h_1(int *cicli,int RSA){ int jolly=(sqrt(RSA/2))/6; int i=0; int G=(RSA-1)/6; int A=(G-jolly)/(6*jolly+1); int B=(G-A)/(6*A+1); int C=2; while((6*B+1)*(RSA/(6*B+1))!=RSA && (C*(RSA/C)!=RSA && C!=1)){ B++; (*cicli)++; C=(-6*i+sqrt(36*i*i+4*RSA))/2; i++; } if(C*(RSA/C)==RSA){return C;} return (6*B+1); }
Risposte
Provo a dare una mezza soluzione:
Se $RSA=p*q$ e $p=6a+1$ e $q=6b+1$ allora
una parte dell'algoritmo avrà la complessità $b-a$ questa $C=(-6*i+sqrt(36*i*i+4*RSA))/2;$
l'altra parte $b-(((RSA)/(sqrt((RSA)/2)/6)-1)/6)$
Però non capisco quando si incrociano cioè qual'è la complessità del algoritmo con input $RSA=p*q$ dove $2>q/p>1$
Se $RSA=p*q$ e $p=6a+1$ e $q=6b+1$ allora
una parte dell'algoritmo avrà la complessità $b-a$ questa $C=(-6*i+sqrt(36*i*i+4*RSA))/2;$
l'altra parte $b-(((RSA)/(sqrt((RSA)/2)/6)-1)/6)$
Però non capisco quando si incrociano cioè qual'è la complessità del algoritmo con input $RSA=p*q$ dove $2>q/p>1$
Per renderlo più efficiente
sostituire
con
sostituire
"P_1_6":int jolly=(sqrt(RSA/2))/6;
con
int jolly=(sqrt(2*RSA))/6;
#include <stdio.h> #include <stdlib.h> #include <math.h> /*rossella è ottimizzato per fattorizzare numeri RSA =p * q dove RSA,p e q sono nella forma 6*h+1*/ /*Autore Alberico Lepore*/ int rossella(long long int *cicli,long long int RSA); int main(){ long long int RSA=0; long long int cicli=0; long long int jolly; long long int fattore=1; scanf("%lli",&RSA); printf("\n%lli\n",RSA); jolly=(sqrt(RSA/2))/6; fattore=rossella(&cicli,RSA); printf("\n%lli è diviso da %lli in %lli cicli\n",RSA,fattore, cicli); } rossella(long long int *cicli,long long int RSA){ long long int jolly[99]; int j=0; long long int i=0; long long int G=(RSA-1)/6; long long int A[99]; long long int B[99]; long long int C=2; long long int D[99]; long long int maggiore=0; long long int E=0; for(j=0;j<100;j++){ jolly[j]=(j+1); } for(j=0;j<100;j++){ A[j]=(G-jolly[j])/(6*jolly[j]+1); B[j]=(G-A[j])/(6*A[j]+1); } j=0; while(j<100){ while(A[j]>B[j]){ D[j]=B[j]; A[j]=(G-6*B[j]-1)/(6*(6*B[j]+1)); B[j]=(G-A[j])/(6*A[j]+1); (*cicli)++; } j++; } for (j=0;j<100;j++){ if(D[j] > maggiore){ maggiore=D[j]; } } E=(G-maggiore)/(6*maggiore+1); if(E>((sqrt(RSA))-1)/6){ while((RSA/(6*E+1))*(6*E+1)!=RSA){ E--; (*cicli)++; } }else{ for(j=7;j<=sqrt(RSA);j++){ printf("\nj=%d\n",j); if(RSA%j==0){ printf("\nl'algoritmo rossella è ottimizzata per RSA reali anche se implementato con long long int\n"); return j; } } } return (6*E+1); }
while(j<100){ while(A[j]>B[j]){ D[j]=B[j]; A[j]=(G-6*B[j]-1)/(6*(6*B[j]+1)); B[j]=(G-A[j])/(6*A[j]+1); (*cicli)++; } j++; }
Per piacere mi potreste dire come evitare il ciclo interno.
Cioè come posso sapere in un colpo solo quando A diventa minore di B?
ULTIMA VERSIONE
#include <stdio.h> #include <stdlib.h> #include <math.h> /*rossella è ottimizzato per fattorizzare numeri RSA =p * q dove RSA,p e q sono nella forma 6*h+1*/ /*Autore Alberico Lepore*/ int rossella(long long int *cicli,long long int RSA); int main(){ long long int RSA=0; long long int cicli=0; long long int jolly; long long int fattore=1; scanf("%lli",&RSA); printf("\n%lli\n",RSA); jolly=(sqrt(RSA/2))/6; fattore=rossella(&cicli,RSA); printf("\n%lli è diviso da %lli in %lli cicli\n",RSA,fattore, cicli); } rossella(long long int *cicli,long long int RSA){ long long int jolly[99]; int j=0; long long int i=0; long long int G=(RSA-1)/6; long long int A[99]; long long int B[99]; long long int C=2; long long int D[99]; long long int maggiore=0; long long int E=0; for(j=0;j<100;j++){ jolly[j]=(j+1); } for(j=0;j<100;j++){ A[j]=(G-jolly[j])/(6*jolly[j]+1); B[j]=(G-A[j])/(6*A[j]+1); } j=0; while(j<100){ while(A[j]>B[j]){ D[j]=B[j]; A[j]=(G-6*B[j]-1)/(6*(6*B[j]+1)); B[j]=(G-A[j])/(6*A[j]+1); (*cicli)++; } j++; } for (j=0;j<100;j++){ if(D[j] > maggiore){ maggiore=D[j]; } } E=maggiore; if(E<((sqrt(RSA))-1)/6){ while((RSA/(6*E+1))*(6*E+1)!=RSA){ E--; (*cicli)++; } }else{ for(j=7;j<=sqrt(RSA);j++){ printf("\nj=%d\n",j); if(RSA%j==0){ printf("\nl'algoritmo rossella è ottimizzata per RSA reali anche se implementato con long long int\n"); return j; } } } return (6*E+1); }