Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur d'acces aux elements de ArrayList<BigInteg>

    26 mai 2022 à 21:04:39

    Bonsoir;

    Je veux adapter mon code avec le test MillerRabin mais avec le BigIn,teger c'est pas gagner;

    le test MillerRabin fonctionne sans problème mais en intégrant avec mon code j'ai des difficultés au niveau des différents test mais sans erreur de compilation;aussi une erreur de compilation sur la méthode get() qui est plus gênant encore dont je ne vois pas d'autre méthodes dans mes recherches;

    Je mets seulement mon code vue que le test MillerRabin fonctionne;

    vue que c'est mon code qui a le problème et pour ne pas trop surcharge l’écran:

    d'abord le message d'erreur:

    Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    	i cannot be resolved
    	i cannot be resolved
    	i cannot be resolved to a variable
    	i cannot be resolved
    	The operator < is undefined for the argument type(s) java.math.BigInteger, java.math.BigInteger
    	i cannot be resolved
    	i cannot be resolved to a variable
    	i cannot be resolved
    	i cannot be resolved to a variable
    	The method get(int) in the type ArrayList<BigInteger> is not applicable for the arguments (BigInteger)
    	i cannot be resolved
    	i cannot be resolved to a variable
    	i cannot be resolved to a variable
    	The method get(int) in the type ArrayList<BigInteger> is not applicable for the arguments (BigInteger)
    	The method get(int) in the type ArrayList<BigInteger> is not applicable for the arguments (BigInteger)
    
    	at TestMillerRabbinPremier.TestMillerRabbinPremier.Formule2(TestMillerRabbinPremier.java:83)
    	at TestMillerRabbinPremier.TestMillerRabbinPremier.main(TestMillerRabbinPremier.java:23)
    



    package TestMillerRabbinPremier;
    
    //Arup Guha
    //Originally written in Fall 2006, edited on 10/23/07 for CIS 3362.
    import java.math.BigInteger;
    import java.util.*;
    
    public class TestMillerRabbinPremier {
    	
    	// Just used to test out our MillerRabinTest
    	public static void main(String[] args) {
    		TestMillerRabbinPremier Lu = new TestMillerRabbinPremier();
    		Scanner stdin = new Scanner(System.in);
    		
    		// Get a number to test.
    		System.out.println("Enter a number to test for primality.");
    		BigInteger mynum = new BigInteger(stdin.next());
    		 if (MillerRabin(mynum, 50))
    				
    				System.out.println("Le nombre est premier; Impossible de decomposer");
    		 else
    		// Output our result...run MillerRabin 50 times.
    		System.out.printf("\n"+ Lu.Formule2(mynum));
    			
    		stdin.close();
    	}
    	
    	
    	public BigInteger Div1 (BigInteger mynum) {	
    		
    		if (MillerRabin(mynum, 50))
    			  return BigInteger.valueOf (1);
    		else
    					
    		        return BigInteger.valueOf (2);
    		        
    		                         }
    		    
    	
    	public BigInteger Formule2 (BigInteger mynum  ){
    		ArrayList<BigInteger> V= new ArrayList<BigInteger> ();
    		ArrayList<BigInteger> U= new ArrayList<BigInteger> ();
    		BigInteger p=new BigInteger("0");
    		BigInteger UN=new BigInteger("1");
    		Integer i1 =0;
    		//BigInteger i=new BigInteger("0");
    		long n=0;
            
    		if (mynum.mod(new BigInteger("2")).equals( BigInteger.valueOf(0))) 	{
    								
    			BigInteger p1=new BigInteger("2");
    			BigInteger q1=mynum.divide(BigInteger.valueOf(2));
    			if (MillerRabin(q1, 50))
    				
    				{
    				U.add(p1);
    				U.add(q1);
    				
    				 }
    				}
    			else {
    		
    
    		   for (BigInteger j = UN ; j.compareTo((mynum).divide(new BigInteger("2"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	
    
              
    		   BigInteger deux=new BigInteger("2");
    		   BigInteger b=new BigInteger("1");
    		  		
    		   while (( Div1((deux.multiply(j)).add(b)).compareTo(new BigInteger("1"))==-1) && (((deux.multiply(j)).add(b)).compareTo(mynum)< 0)) {
    		
    		    b = b.add(new BigInteger("2")); 
    	
    	     	}	
    		       p=(deux.multiply(j)).add(b);
    		       
    		       Integer j1=j.intValue();
    		  
    		       if ((deux.multiply(j)).add(b).compareTo(mynum)==0) {
    			   
    		    	  
    		    	  
    			   if (i.compareTo(new BigInteger("0")) == -1) {
    				   
    				   V.add(p);
    				   
    				   i.add(i).add(new BigInteger("1"));
    			   } 
    				   else if ((i.compareTo(new BigInteger("0")) == -1) && (V.get(j1)<p)) {
    					   
    					   V.add(p);
    					   
    					   i.add(i).add(new BigInteger("1"));
    				   }
    			   }
    			   
    			   
    		    }
    		  
    		      n=V.size();
    		
    		      for (BigInteger j = UN ; j.compareTo((new BigInteger ("n")).subtract(new BigInteger("1"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	
    
    
    				BigInteger deux=new BigInteger("2");
    				BigInteger b=new BigInteger("1");
    				i.add(j).add(new BigInteger("1"));
    				
    				
    				while (V.get(i).multiply(V.get(j)).compareTo(mynum)<0) {
    				
    					 i.add(i).add(new BigInteger("1"));
    			
    				}	
    				  
    				  
    				   if (V.get(i).multiply(V.get(j)).compareTo(mynum).equals( BigInteger.valueOf(0))) {
    					   
    					     U.add(V.get(0));
    						 U.add(V.get(1));
    					   } 
    						  
    					   }			   
    		 
    		 
                 n=U.size();
    		     for (BigInteger j = UN ; j.compareTo(new BigInteger ("n")) == -1 || j.compareTo(new BigInteger ("n")) == 0; j = j.add(new BigInteger("1")) ) {	
    		     return U.get(j);
    		     } 
    		}
    }
    	


    Merci d'avance pour votre aide

    -
    Edité par sandaff 26 mai 2022 à 21:09:18

    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2022 à 21:36:42

      Bonjour,

      Ligne 89, tu compares p avec V.get(j1)  (un big int) avec <.

      A d'autres endroits, tu fais V.get(i) avec i big int.

      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2022 à 1:12:42

        brubru777 a écrit:

        Bonjour,

        Ligne 89, tu compares p avec V.get(j1)  (un big int) avec <.

        A d'autres endroits, tu fais V.get(i) avec i big int.

        Dans :

        public BigInteger Formule2 (BigInteger mynum  ){
        
        
        
        		   for (BigInteger j = UN ; j.compareTo((mynum).divide(new BigInteger("2"))) == -1 || j.compareTo((mynum).divide(new                                                   
        
                                 BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	      /* Ici on fait la liste des nombres premiers */
        
        		                                                                                                    /* tout ce passe dans tantque */
        
        		   while (( Div1((deux.multiply(j)).add(b)).compareTo(new BigInteger("1"))==-1) && (((deux.multiply(j)).add(b)).compareTo(mynum)< 0))                       
        
                                {
        
                                  /* Recherche  des nombres premiers ici*/
        
        	         	}	
        
        		       p=(deux.multiply(j)).add(b); /* Récupération de chaque nombre premier dans p et on l’insère dans le tableau V*/
        
        		       	   
        
        		         }
        
        		  
        
        		      n=V.size();
        
        		
        
        		      for (BigInteger j = UN ; j.compareTo((new BigInteger ("n")).subtract(new BigInteger("1"))) == -1 || j.compareTo((mynum).divide(new                             
        
                                      BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	
        
                                       /* Ici on fait  le calcule des facteurs premiers et tout ce passe dans tantque*/				
        
        				while (V.get(i).multiply(V.get(j)).compareTo(mynum)<0) {				
        
        			         
        
        				}	
        
        			  }	 
        
                     
        
        		     for (BigInteger j = UN ; j.compareTo(new BigInteger ("n")) == -1 || j.compareTo(new BigInteger ("n")) == 0; j = j.add(new                                     
        
                                BigInteger("1")) ) {	
        
                                      /* Ici renvois  des deux facteurs  premiers obtenu  dans le deuxième tantque*/
        
        		                  return U.get(j);
        
        		            } 
        
        		}
        
        }
        
        	

        Donc il y a deux problèmes:

        -Le premier; c'est la compilation dû à cette comparait ion que vous signalez;

        et le problème est que je ne maîtrise pas les BigInteger qui n'est pas aussi un niveau débutant hein ; donc c'est la galère pour moi.

        sinon c'est ça que je veux faire:

        Sinon Si ((i0) et (V[i]<P(j) )) alors  qui permet d’éviter les doublons 

        -Le deuxième est les tests; je ne pense pas si la façon dont j'ai effectué les tests sont correctes

        tels que:

        while (( Div1((deux.multiply(j)).add(b)).compareTo(new BigInteger("1"))==-1) && (((deux.multiply(j)).add(b)).compareTo(mynum)< 0)) {

        Je veux dire:

        TANTQUE ((div1(2j+b) )1 ) et ((2j+b)<m)) faire

        et ça:

        TANTQUE (V[j] * V[i] <m) faire

        Merci !

        Je veux d'abord résoudre la compilation; donc veuillez repréciser votre question?

        J'ai cherché partout un cas similaire d'un tableau ArrayList de BigInteger et lecture de ses éléments sans succès;

        en plus j1 ou V.get(j1) n'est qu'une tentative désespérée de changement de type vue son message d'erreur;



        -
        Edité par sandaff 27 mai 2022 à 4:01:37

        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2022 à 4:30:27

          Bonjour, Il n'est pas nécessaire d'écrire si grand, on sait vous lire avec une taille de police normal.

          Mise en page abusive

          Les outils de mise en page on pour seul but de rendre votre message plus lisible et compréhensible. Pas à faire des décorations expérimentales ou à s'amuser à faire des textes arc-en-ciel.

          Merci de toujours réduire la mise en page au strict nécessaire, aérer votre texte, éviter les pavés de texte indigestes, ...

          Liens conseillés

          • Partager sur Facebook
          • Partager sur Twitter
            27 mai 2022 à 5:06:22

            OK

            Après avoir raboter ça reste une seule erreur de compilation : c'est le return ;

            Comment renvoyer le résultât d'un tableau  pour une seule sortie; il y a deux valeurs dans le tableau U qui doivent être renvoyées dans Formule2;

            voici mes tentatives:

            public BigInteger Formule2 (BigInteger mynum  ){
            		ArrayList<BigInteger> V= new ArrayList<BigInteger> ();
            		ArrayList<BigInteger> U= new ArrayList<BigInteger> ();
            		BigInteger p=new BigInteger("0");
            		BigInteger p1=new BigInteger("0");
            		BigInteger q1=new BigInteger("0");
            		BigInteger UN=new BigInteger("1");
            		BigInteger i=new BigInteger("0");
            		BigInteger j=new BigInteger("0");
            		
            		long n=0;
                    
            		if (mynum.mod(new BigInteger("2")).equals( BigInteger.valueOf(0))) 	{
            								
            			 p1.add(new BigInteger("2"));
            			q1.add(mynum.divide(BigInteger.valueOf(2)));
            			if (MillerRabin(q1, 50))
            				
            				{
            				U.add(p1);
            				U.add(q1);
            				
            				 }
            				}
            			else {
            		
            
            		   for (j = UN ; j.compareTo((mynum).divide(new BigInteger("2"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	
            
                      
            		   BigInteger deux=new BigInteger("2");
            		   BigInteger b=new BigInteger("1");
            		  		
            		   while (( Div1((deux.multiply(j)).add(b)).compareTo(new BigInteger("1"))==-1) && (((deux.multiply(j)).add(b)).compareTo(mynum)==-1)) {
            		
            		    b = b.add(new BigInteger("2")); 
            	
            	     	}	
            		       p=(deux.multiply(j)).add(b);
            		       Integer i1=i.intValue();
            		       
            		  
            		       if ((deux.multiply(j)).add(b).compareTo(mynum)==0) {
            			   
            		    	  
            		    	  
            			   if (i.compareTo(new BigInteger("0")) == -1) {
            				   
            				   V.add(p);
            				   
            				   i.add(i).add(new BigInteger("1"));
            			   } 
            				   else if ((i.compareTo(new BigInteger("0")) == -1) && (V.get(i1).compareTo(p)==-1)) {
            					   
            					   V.add(p);
            					   
            					   i.add(i).add(new BigInteger("1"));
            				   }
            			   }
            			   
            			   
            		    }
            		  
            		      n=V.size();
            		
            		      for ( j = UN ; j.compareTo((new BigInteger ("n")).subtract(new BigInteger("1"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {	
            
            
            				BigInteger deux=new BigInteger("2");
            				BigInteger b=new BigInteger("1");
            				i.add(j).add(new BigInteger("1"));
            				 Integer j1=j.intValue();
            				 Integer i1=i.intValue();
            				
            				while (V.get(i1).multiply(V.get(j1)).compareTo(mynum)==-1) {
            				
            					 i.add(i).add(new BigInteger("1"));
            			
            				}	
            				        
            				  
            				   if (V.get(i1).multiply(V.get(j1)).compareTo(mynum)==0) {
            					     
            					     /*p1.add(V.get(0));
            						 q1.add(V.get(1));*/
            					   
            					     U.add(V.get(0));
            						 U.add(V.get(1));
            					   } 
            						  
            					   }		 
                         
            		             }
            		
            		    /* return p1 ;
            		     return q1 ;
            		     */
            	    	        return U ;
            	    	
            	      
                }
            	



            Merci d'avance.

            • Partager sur Facebook
            • Partager sur Twitter
              27 mai 2022 à 10:30:53

              Si tu veux retourner U (liste), il suffit de changer le type de retour de la méthode.

              public ArrayList<BigInteger> Formule2(BigInteger mynum) {



              • Partager sur Facebook
              • Partager sur Twitter
                27 mai 2022 à 18:44:58

                Bonsoir  Monsieur brubru777;

                Merci pour votre aide ; j’ai beaucoup avancé car les erreurs de compilation ont disparu ;

                Ça me reste l’exécution :

                Je mets d’abord à coté la récupération des deux valeurs dans Main() ; les deux valeurs sortent dans un tableau U ; donc comment les afficher dans main() ; je vais revenir;

                1-Pour l’instant je galère au niveau de :

                p1.add(new BigInteger("2"));

                q1.add(mynum.divide(BigInteger.valueOf(2)));

                Toutes les deux valeurs affichent 0 avec la trace ;

                Voici le code erreur :

                Enter a number to test for primality.
                22
                Exception in thread "main" java.lang.IllegalArgumentException: numBits must be non-negative
                	at java.math.BigInteger.randomBits(Unknown Source)
                	at java.math.BigInteger.<init>(Unknown Source)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.MyMillerRabin(TestMillerRabbinPremier.java:171)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.MillerRabin(TestMillerRabbinPremier.java:225)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.Formule2(TestMillerRabbinPremier.java:65)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.main(TestMillerRabbinPremier.java:24)
                Je suis dans else Main().
                Je suis dans formule2.
                Je suis dans formule2 et modulo.
                p1=0
                q1=0
                

                2- mon test n’est pas vrai car il ne doit pas sortir dans while au niveau de (2j+b)=15 ; Div1=2 donc ça doit continuer à chercher jusqu’à 17 avant de sortir; par exemple :

                while (( Div1((deux.multiply(j)).add(b)).compareTo(new BigInteger("1"))<0) && (((deux.multiply(j)).add(b)).compareTo(mynum)==-1)) {

                Voici ce que je veux faire :

                TANTQUE ((div1(2j+b) )1 ) et (2j+b<m)) faire

                3-ça ne reconnaît pas n qui est la taille du tableau V: je récupère avec long n=V.size() ;

                Code erreur :

                Exception in thread "main" java.lang.NumberFormatException: For input string: "n"
                	at java.lang.NumberFormatException.forInputString(Unknown Source)
                	at java.lang.Integer.parseInt(Unknown Source)
                	at java.math.BigInteger.<init>(Unknown Source)
                	at java.math.BigInteger.<init>(Unknown Source)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.Formule2(TestMillerRabbinPremier.java:114)
                	at TestMillerRabbinPremier.TestMillerRabbinPremier.main(TestMillerRabbinPremier.java:24)
                
                

                4- j’ai déjà posé ça dans le précédent message :

                Sinon Si ((i0) et (V[i]<P(j) )) et vous aviez fait une remarque là dessus ; donc est ce le test est vrai ?

                else if ((i.compareTo(new BigInteger("0")) == -1) && (V.get(i1).compareTo(p)==-1)) {


                Merci d'avance






                • Partager sur Facebook
                • Partager sur Twitter
                  27 mai 2022 à 22:26:38

                  Je n'ai pas de réponse pour 1 et 2.

                  Pour 3, il faut enlever les guillemets autour de n.

                  Pour 4, il faut essayer mais ça a l'air correct.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mai 2022 à 13:00:54

                    Merci je suis presque arrivé;

                    tout les résultats sont correct;

                    1-Maintenant  le résultat est dans un crochet et comment enlever les deux valeurs dans le crochet?

                    2-je veux changer la condition du premier for avec Math. sqrt(mynum) mais il y a erreur d'exception:

                    càd:

                    double ct=mynum.intValue();

                                  ct=Math. sqrt(ct) ;

                                  for (j = DEUX ; j.compareTo(new BigInteger("ct")) == -1 || j.compareTo(new BigInteger("ct"))== 0 ; j = j.add(new BigInteger("1"))) {

                        3-dans le deuxième for la taille du tableau est un long alors que cette taille provient du tableau BigInteger qui peut dépasser la plage de valeur de long;

                    il n y a t-il pas une méthode qui peut calculer la taille avec BigInteger?

                    càd:

                     long n=V.size();    

                          for ( j = ZERO ; j.compareTo(( BigInteger.valueOf(n)).subtract(new BigInteger("1"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {

                    Merci;

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mai 2022 à 7:35:23

                      1) Qu'appelles-tu "mon résultat est dans un crochet" ?

                      Peux-tu montrer ce que tu obtiens et ce que tu souhaites ?

                      2) Tu as encore mis des guillemets sur cn.

                      3) une taille de liste, c'est un int, pas un long. A moins que tu aies un supercalculateur à la maison.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mai 2022 à 15:43:15

                        Bonsoir Mr brubru777;

                        brubru777 a écrit:

                        1) Qu'appelles-tu "mon résultat est dans un crochet" ?

                        Peux-tu montrer ce que tu obtiens et ce que tu souhaites ?

                        1-Je veux dire le tableau

                        pour vous éclairer voici la trace et vous verrez aussi le résultat dans [ ] alors que je veux la première valeur P=  à la ligne aussi q =

                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        22
                        Recherche des facteurs premiers:
                        
                        [2, 11]
                        
                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        25
                        Recherche des facteurs premiers:
                        
                        [5, 5]
                        
                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        55
                        Recherche des facteurs premiers:
                        
                        [11, 5]
                        
                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        11831
                        Le nombre est premier; Impossible de decomposer
                        
                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        11227
                        Recherche des facteurs premiers:
                        
                        [109, 103]
                        
                        Entrez votre RSA nombre pour chercher ses facteurs premiers:
                        25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
                        
                        Recherche des facteurs premiers:
                        
                        

                        vous avez vue un autre problème avec le RSA-24, ma machine s’éteint après 5 à 10 minutes; ça ne termine pas

                        brubru777 a écrit:

                        2) Tu as encore mis des guillemets sur cn.

                        2- non voici l’entête:

                        for (j = DEUX ; j.compareTo((mynum).divide(new BigInteger("2"))) == -1 || j.compareTo((mynum).divide(new BigInteger("2")))  == 0 ; j = j.add(new BigInteger("1"))) {

                        J'ai l'intention de faire l'autre là mais pas encore; c'est pour réduire le calcule mais j'ai un problème quant à l'application de Math. sqrt()  avec BigInteger;

                        brubru777 a écrit:

                        3) une taille de liste, c'est un int, pas un long. A moins que tu aies un supercalculateur à la maison.

                        Ici c'est long vu la taille de RSA-24bits, pour l'instant ça marche sauf que ce n'est pas sur car vu la taille de calcul j'ai un pressentiment que ça(le tableau obtenu avec nombre RSA) doit dépasser la plage de valeur de long;   

                        Vous avez vue dans la trace le nombre RSA-24?

                        Merci d'avance!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mai 2022 à 16:23:06

                          1) Il suffit d'afficher indépendamment U.get(0) sur une ligne et U.get(1) sur la suivante.

                          2) Je te cite :

                          - "for (j = DEUX ; j.compareTo(new BigInteger("ct")) == -1 || j.compareTo(new BigInteger("ct"))== 0 ; j = j.add(new BigInteger("1"))) {"

                          Il n'existe pas de méthode sqrt pour les BigInteger.

                          3)

                          Tu confonds la taille du tableau avec la taille des nombres.

                          Aucun ordinateur sur terre n'a la capacité pour stocker un tableau de la taille de ton RSA.

                          p.s.: Tu parles de RSA 24 bits.

                          Normalement, avec 24 bits la valeur max est aux alentours de 16 000 000, ce qui tient largement dans un int codé sur 32 bits. Donc pourquoi utilises-tu des BigInteger ?

                          Soit j'ai loupé un truc, soit ton algorithme a un gros problème.

                          -
                          Edité par brubru777 29 mai 2022 à 16:34:01

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 mai 2022 à 0:03:42

                             Bonsoir Mr brubru777;

                            brubru777 a écrit:

                            1) Il suffit d'afficher indépendamment U.get(0) sur une ligne et U.get(1) sur la suivante.

                            2) Je te cite :

                            Merci pour votre aide;

                            je dois l'afficher hors Methode;

                            càd avec une instance Lu dans Main() et c'est ça le problème car U n'est pas déclaré dans Main();

                            brubru777 a écrit:

                            3)

                            Tu confonds la taille du tableau avec la taille des nombres.

                            Aucun ordinateur sur terre n'a la capacité pour stocker un tableau de la taille de ton RSA.

                            p.s.: Tu parles de RSA 24 bits.

                            Normalement, avec 24 bits la valeur max est aux alentours de 16 000 000, ce qui tient largement dans un int codé sur 32 bits. Donc pourquoi utilises-tu des BigInteger ?

                            Soit j'ai loupé un truc, soit ton algorithme a un gros problème.

                            Vous voulez dire que le nombre d(occurrence entre 2 et RSA 24 bits est 16 000 000?

                            d'abord je me suis trompé; je veux dire RSA 1024 bits mais aussi RSA 2049 bits mais vue que long est dan les 18 chiffres ce qui veux dire qu'il n aura pas de grand changement particulier avec les types de RSA;

                            Si c'est ça alors mon problème est résolu et mon algo sera exécuté jusqu'à terme si mon ordinateur arrête de me jouer le tour; càd s’éteindre à chaque 5 ou 10 minutes; 

                            ce que je veux stocké dans ce tableau V est les valeurs des nombres premiers entre 5 au nombre RSA 1024 ou 2048 bits, avant de passer dans le tableau U;

                            et si V.size()= càd entre 1 à 16 000 000 ; je serai donc à l'aise car je dois boucler U entre 0 à 16 000 000 -1;

                            -
                            Edité par sandaff 30 mai 2022 à 0:28:57

                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 mai 2022 à 7:37:55

                              Alors 1024 bits, c'est plus compliqué.

                              Le problème, c'est qu'un tableau a une taille en int, c'est à dire avec une taille maxi d'environ 2 000 000 000.

                              Avec des int dedans, ça fait 8 Go.

                              Avec des long dedans, ça fait 16 Go..

                              Avec des BigInteger, ça va saturer ta RAM.

                              Donc déjà si tu veux faire un tableau de taille long (64 bits) il te faudra 4 000 000 000 000 000 000 octets * 8 (long = 8 octets), soit 32 000 000 000 Go.

                              Pour faire un tableau avec une taille d'un nombre de 1024 bits, c'est juste impossible.

                              Si ton but est de trouver tout les nombres premiers de 1024 bits pour craquer RSA, tu vas juste flinguer ton ordinateur en saturant ta mémoire.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 mai 2022 à 12:20:05

                                EH!!

                                d' où la raison de l'extinction de ma machine?

                                Alors quels conseil me donnerez vous?

                                est ce la liste chaîné pourrait marcher sur ce genre d'opération?

                                Une précision aussi:

                                le but est de trouver les deux facteurs premiers de RSA des différents bits; mais retrouver les nombres premiers entre 1 et n bits de RSA est très long en temps;

                                donc je dois modifier les paramètres de calcule; car les deux nombres se trouverais entre 308 chiffres et 309 chiffres et 308 chiffres X 309 chiffres = n bits RSA  cherché;

                                Mais pour une question d'expérience, j'aimerais savoir toutes les possibilités ;

                                Donc il y a deux idées qui se contrastes:

                                les nombres premiers 5, 7, 11, ......jusqu'à la limite n bits RSA; c'est l'ensemble de tous ça qui est grand pour le tableau ou un seul chiffre de 1024 bits qui sort hors capacité du tableau?

                                Merci

                                -
                                Edité par sandaff 30 mai 2022 à 12:42:42

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 mai 2022 à 13:34:49

                                  Un seul nombre de 1024 bits, c'est facile à stocker. Ca prend 1024/8 = 128 ko.

                                  Le problème, c'est la taille du tableau et le temps de calcul.

                                  Pour info, à taille égale, une liste chainée prend plus de mémoire qu'un tableau. Ca ne fera qu'empirer ton problème.

                                  Même si tu utilisais toutes les ressources de l'univers, tu ne pourrais pas stocker autant de nombres. Quant au temps de calcul, le soleil mourra avant que tu aies le résultat.

                                  Donc forcément, un pauvre petit pc rend l'âme en 5-10 minutes. :)

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 mai 2022 à 17:11:55

                                    Ehh Bien!!!

                                    Comment ont t il fait, ceux qui ont déjà craqué certains de ces fotu RSA nombres?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      30 mai 2022 à 19:10:12

                                      Je ne sais plus qui a dit "un bon algorithme vaut mieux qu'un bon ordinateur'.

                                      Ton algorithme, qui consiste à tester toutes les valeur, s'appelle "force brute".

                                      C'est le plus simple mais aussi le plus inefficace.

                                      Tu peux regarder d'autres algorithmes sur wikipedia -> RSA mais je pense qu'il faut un sacré niveau en maths et en info pour les implémenter efficacement. De plus, je doute qu'un simple pc suffise pour obtenir le moindre résultat.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        31 mai 2022 à 17:19:18

                                        Je suis aller lire sur  ce site et j'ai compris leur théorie en ce qui concerne l’algorithme de factorisation en facteur premier;

                                        je vois que ce n'est pas trop loin de mon concept de divi(nombre); donc j'ai modifié le code et ça tourné de 23 heurs à 4 heurs 40 avant que le courant ne part;

                                        mais ce matin je l'ai relancé a penne 5 minute ça s'est éteint; je l'ai redémarré et avant de le lancé , a penne démarré, ça s'est éteint ;

                                        d'où un problème de sur chauffe;

                                        Mais voici le bout de code que j'ai modifié s'il y a une critique: le premier for est remplacé par

                                        j=new BigInteger("10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003");
                                        					System.out.println("J ="+j);
                                        					
                                        				while ( j.compareTo(new BigInteger("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999")) == -1 || j.compareTo(new BigInteger("999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"))  == 0 ) {	
                                        			   
                                                    	 if( mynum.mod(j).equals( BigInteger.valueOf(0))){  
                                        		    			    	   
                                        				   V.add(j);
                                        			
                                                    	  }
                                                    	 j = j.add(new BigInteger("2"));
                                                    	 
                                                    	 //System.out.println("V ="+V);
                                        		    }

                                        Merci

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          31 mai 2022 à 18:33:59

                                          Toujours le même problème. Tu vas remplir ta liste jusqu'à ce que la mémoire soit pleine.

                                          A force, tu vas griller ta mémoire ou pire, ta carte mère.

                                          Mon conseil : arrêter de t'acharner sur un problème insoluble.

                                          Sur ce, j'arrête d'intervenir sur ce sujet. Si tu veux continuer, libre à toi. :)

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            31 mai 2022 à 20:23:35

                                            brubru777 a écrit:

                                            Un seul nombre de 1024 bits, c'est facile à stocker. Ca prend 1024/8 = 128 ko.

                                            Le problème, c'est la taille du tableau et le temps de calcul.

                                            Pour info, à taille égale, une liste chainée prend plus de mémoire 


                                            128 octets.

                                            Aussi : les maillons d'une liste chaînée sont dispersés en mémoire, alors que ceux d'un tableau ou arraylist se trouvent à proximité. Ce qui a un effet important sur le cache, donc les performances.

                                            Les ordinateurs qui "font des blagues" genre surchauffe/coupure ne guérissent pas spontanément. Ça ne peut qu'evoluer en pire.  Sauver les données et faire réparer.

                                            -
                                            Edité par michelbillaud 31 mai 2022 à 20:29:57

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              1 juin 2022 à 2:13:27

                                              brubru777 a écrit:

                                              Toujours le même problème. Tu vas remplir ta liste jusqu'à ce que la mémoire soit pleine.

                                              Non!!

                                              ça ne serait pas le cas;  non seulement les nombres stockés est restreint, très rare; ce n'est plus les nombres premiers entre 5 et nombre RSA 2048 bits car l'algo à changé de concept mais aussi j'ai déjà une idée bête;     

                                              soit je l'affiche et à chaque 5 minutes je copie et colle dans word et au fur à mesure je peux essayer des test sur ce qui trouvé manuellement si a*b=RSA bits; 

                                              en fin aussi je peu les insérer dans le tableau excell me connecté et puis ramener en java pour le test;

                                              ou enregistrer à chaque 5 minutes les valeurs et au démarrage je commence là ou j'ai terminé ; ça je maîtrise les fichiers avec turbo pascal uniquement;

                                              Nous somme en science; donc même l'idée est bête, j'ai ce courage, il faut continuer à m'encourager sans aussi se décourager s'il y a une idée pour me recadrer;

                                               Bonsoir Mr michelbillaud;

                                              j'ai un problème de virus mais la connexion fait défaut pour télécharger un anti virus; le téléchargement s'entrecoupe alors que les frais de connexion est devenu cher ici;

                                              je ne fais que gaspiller mon argent car la taille de l'anti virus est un peu grand;

                                              merci pour votre intervention!

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Erreur d'acces aux elements de ArrayList<BigInteg>

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown