gene de hasard
Le
remy
bonjour
l'idee de base consiste a faire la difference entre deux nb premier
j'aimerais bien avoir votre avis sur cette idee deja connue peut etre ?
pour les nb impairs une concatenation et l'on retaille a 8 bits
devrait aussi peut etre faire l'affaire java n'est pas vraiment adapte :(
merci remy
code java
import java.util.*;
import java.lang.*;
import java.math.*;
public class gene
{
public static void main(String args[])
{
if(args.length!=1)
{
System.out.println("generateur ");
System.out.println(" java gene nb_premier " );
System.out.println(" ex :java gene 3623 ");
return;
}
String strp=args[0];
BigInteger p=new BigInteger(strp);
BigInteger tmp_p=p;
BigInteger res;
BigInteger pow=new BigInteger("2");
int n=p.toString(2).length();
pow=pow.pow(n);
if(! p.isProbablePrime(100))
{
System.out.println(p+ " n'est pas un nb premier");
return;
}
while (true)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
res=p.subtract(tmp_p);
if(res.toString(2).length()<32)
{
System.out.print(res +" ");
}
else
{
System.out.println("ca arrive ");
}
tmp_p=p;
n=p.toString(2).length();
if (n>100){n=1;}
pow=new BigInteger("2");
pow=pow.pow(n);
}
}
}
}
l'idee de base consiste a faire la difference entre deux nb premier
j'aimerais bien avoir votre avis sur cette idee deja connue peut etre ?
pour les nb impairs une concatenation et l'on retaille a 8 bits
devrait aussi peut etre faire l'affaire java n'est pas vraiment adapte :(
merci remy
code java
import java.util.*;
import java.lang.*;
import java.math.*;
public class gene
{
public static void main(String args[])
{
if(args.length!=1)
{
System.out.println("generateur ");
System.out.println(" java gene nb_premier " );
System.out.println(" ex :java gene 3623 ");
return;
}
String strp=args[0];
BigInteger p=new BigInteger(strp);
BigInteger tmp_p=p;
BigInteger res;
BigInteger pow=new BigInteger("2");
int n=p.toString(2).length();
pow=pow.pow(n);
if(! p.isProbablePrime(100))
{
System.out.println(p+ " n'est pas un nb premier");
return;
}
while (true)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
res=p.subtract(tmp_p);
if(res.toString(2).length()<32)
{
System.out.print(res +" ");
}
else
{
System.out.println("ca arrive ");
}
tmp_p=p;
n=p.toString(2).length();
if (n>100){n=1;}
pow=new BigInteger("2");
pow=pow.pow(n);
}
}
}
}

Poser une question


ca va plus vite et plus ""alelatoire""
import java.util.*;
import java.lang.*;
import java.math.*;
public class gene
{
public static void main(String args[])
{
if(args.length!=1)
{
System.out.println("generateur ");
System.out.println(" java gene nb_premier " );
System.out.println(" ex :java gene 7 ");
return;
}
String strp=args[0];
BigInteger p=new BigInteger(strp);
BigInteger tmp_p=p;
BigInteger res;
BigInteger pow=new BigInteger("2");
int n=p.toString(2).length();
pow=pow.pow(n);
boolean búlse;
if(! p.isProbablePrime(100))
{
System.out.println(p+ " n'est pas un nb premier");
return;
}
while (true)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
res=p.subtract(tmp_p);
if (b)System.out.print(res+" ");
tmp_p=p;
if (n>100){n=1;b=true;}
pow=new BigInteger("2");
pow=pow.pow(n);
}
n++;
}
}
}
une dernnier Maj avec un petit bia sur le chifre 1
si vous avez une idee je suis toujour preneur
import java.util.*;
import java.lang.*;
import java.math.*;
public class gene
{ static int tab[]={0,0,0,0,0,0,0,0,0,0};
public static void main(String args[])
{
if(args.length!=4)
{
System.out.println(" java gene cle_n0 cle_n1 cle_n2 qtDeNb " );
System.out.println(" cle_n0 = nb premier ");
System.out.println(" cle_n1 = nb de bit max des nb premier ");
System.out.println(" cle_n2 = puissance max de l'ecard entre deux nb
premier ");
System.out.println(" qtDeNb =nombre de tirage ");
System.out.println(" ex :java gene 3623 100 200 1000 ");
return;
}
BigInteger p=new BigInteger(args[0]);
if(! p.isProbablePrime(100))
{
System.out.println(p+ " n'est pas un nb premier"); return;
}
int taille=Integer.parseInt(args[1]);
int ecart=Integer.parseInt(args[2]);
int qt=Integer.parseInt(args[3]);
System.out.println("init ");
p=newGraine(p,taille);
System.out.println("debut ");
allea(p,ecart,qt);
affiche();
}
public static void allea(BigInteger p,int val, int qt)
{
BigInteger res ,tmp_p=p;
BigInteger pow=new BigInteger("2");
BigInteger on=new BigInteger("1");
boolean stop=true,impaire=true;
int nb=0,n=0;
while (stop)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
nb++;
res=p.subtract(tmp_p);
if(impaire)
{
res=res.subtract(on);
System.out.print(res+" ");
cteFreq(res.toString());
impaireúlse;
}
else
{
System.out.print(res+" ");
cteFreq(res.toString());
impaire=true;
}
cteFreq(res.toString());
tmp_p=p;
if (n>val){n=1;}
if(nb>qt){stopúlse;}
pow=new BigInteger("2");
pow=pow.pow(n);
}
n++;
}
//System.out.println("taille "+p.toString(2).length());
}
public static void affiche()
{
System.out.println();
System.out.println("*********** frequence *************");
for (int i=0;i {
System.out.print(tab[i]+" ");
}
System.out.println();
}
public static void cteFreq(String s)
{
for (int i=0;i {
switch(s.charAt(i))
{
case '0':
tab[0]++;
break;
case '1':
tab[1]++;
break;
case '2':
tab[2]++;
break;
case '3':
tab[3]++;
break;
case '4':
tab[4]++;
break;
case '5':
tab[5]++;
break;
case '6':
tab[6]++;
break;
case '7':
tab[7]++;
break;
case '8':
tab[8]++;
break;
case '9':
tab[9]++;
break;
}
}
}
public static BigInteger newGraine(BigInteger p,int taille )
{
BigInteger pow=new BigInteger("2");
int n =p.toString(2).length();
pow=pow.pow(n);
while (p.toString(2).length()<taille)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
System.out.print(".");
n=p.toString(2).length();
pow=new BigInteger("2");
pow=pow.pow(n);
}
}
System.out.println();
return p;
}
}
Je ne sais pas si c'est très rapide comme générateur. Pour fixer son
degré d'aléa, il faudrait lui faire passer des tests statistiques.
http://csrc.nist.gov/rng/
http://random.com.hr/products/rando...ehard.html
merci
sympa les liens j'en ai au moins pour 6 mois a coder tous les tests
a la vitesse ou j'avance cela va m'occuper un peu les doigts
mais il y a un biais lie a l'idee :-(
la difference de 2 nb premier ne peut faire qu'un nb pair
j'ai modifie un peu la fct
en gros je fais +1 et -1 histoire d'etre honnete mais cela
ne change pas grand chose
par contre j'ai de superbe ecart entre 2 inits "graines" differentes
ce qui me fait un peu plaisir
code modifie de la fct
a+ remy
public static void allea(BigInteger p,int val, int qt)
{
BigInteger res ,tmp_p=p;
BigInteger pow=new BigInteger("2");
BigInteger on=new BigInteger("1");
boolean stop=true,impaire=true,plus=true;
int nb=0,n=0;
while (stop)
{
p=p.add(pow);
if(p.isProbablePrime(100))
{
nb++;
res=p.subtract(tmp_p);
if(impaire)
{
if(plus)
{
res=res.add(on);
plusúlse;
}
else
{
res=res.subtract(on);
plus=true;
}
System.out.print(res+" ");
cteFreq(res.toString());
impaireúlse;
}
else
{
System.out.print(res+" ");
cteFreq(res.toString());
impaire=true;
}
cteFreq(res.toString());
tmp_p=p;
if (n>val){n=1;}
if(nb>qt){stopúlse;}
pow=new BigInteger("2");
pow=pow.pow(n);
}
n++;
}
//System.out.println("taille "+p.toString(2).length());
}
donc retravailler l'idee, elementaire comme dirait l'autre ...
il suffit de faire la somme des chiffres de la difference des deux nb
premiers
mod(2) avec ou sans la cuisine pour les nb impairs
a tester
si le code vous interesse je vous le posterai des qu'il sera fait
je fais une pause
remy