Canalblog
Suivre ce blog Administration + Créer mon blog

Java Machine Learning & IA Think Tank

4 novembre 2019

A la recherche d'un chiffre premier en JAVA grâce au MODULO

Résolution du problème EULER Project numéro 7. Antisèche. JAVA 8.0

Résultat de recherche d'images pour "euler project"Les travaux de EULER sont à l'origine du Projet EULER, l'un des plus grands projets de concours informatiques présents sur internet.

Un nombre premier est un nombre divisible par 1 ou lui même.

Les vingt-cinq nombres premiers inférieurs à 100 sont : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, et 97. (extrait de WIKIPEDIA)

Les nombres premiers sont très utilisés notamment dans les systèmes de cryptographie. Ce qui fera l'objet d'un projet sujet.

Ici, je vais vous proposer un programme vous permettant de générer des chiffres premiers (limité au 999 999ème chiffres selon les performances de votre ordinateur).

Comment a été construit ce programme.

D'abord, il faut savoir qu'il existe un site sous le nom du Projet EULER https://projecteuler.net/.

Le 7ème défi proposé par le projet EULER est le suivant :

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

La traduction : trouver le 10 001st chiffre premier.

Pour répondre au problème j'ai utilisé le MODULO qui est une technique JAVA permettant d'extraire le multiple d'un nombre après sa division.

On prend par exemple 9 et on écrit 9%4= 1

Si un nombre est divisible par 1 ou lui même, cela signifie que son MODULO est toujours égal à 0 quelque soit le chiffre par lequel il va être divisé.  

Donc tous les nombres au Modulo = 0 sont des nombres premiers.

J'ai donc fait un tri entre les modulo = 0 et les autres. Puis j'ai bouclé l'ensemble. Mais la logique est là :

Chaque modulo = 0 est classé premier et chaque modulo différent de zéro n'est pas classé premier car divisible au moins une fois par un nombre différent de 1 ou lui même.  

 qq[zz] = ll[yy]%zz;
 //  System.out.print("\n!"+ll[yy]%zz);
   if (qq[zz]==0)
   { oo[yy]=oo[yy]+1;
 //  System.out.print("Yeah");
   //  System.out.print("test"+oo[yy]);
   }
   if (qq[zz]!=0)
   {oo[yy]=oo[yy]+0;}

La difficulté a été d'imbriquer des boucles pour tester chaque nombre. Cela est prenant en terme de mémoires et de temps. C'est probablement la limite de ce programme. Il m'a tout de même permis de résoudre le problème EULER n°7.

Notez également l'utilisation du Break qui permet de sortir de la boucle une fois le chiffre demandé trouvé.

   if (cheese ==X)
   {   System.out.print("la réponse:");
       System.out.print("\n");
       System.out.print ("le "+cheese+"ème est"+ll[yy]);
  
   break;        (c'est un break bienvenu !)
   }   }

 

Pour trouver par exemple le 12 ème chiffre premier, il vous faudra dire que X = 12 dans le programme qui va suivre.

package chiffrespremiers;

/**  *  * @author user  */ public class Chiffrespremiers {

    /**      * @param args the command line arguments      */     public static void main(String[] args) {         // TODO code application logic here        

 

 

int X = 12; // variable d'entrée il s'agit du chiffre premier que je recherche.

 

  double ii = 0; double qq[] = new double[999999]; double ll[] = new double[999999]; double oo[] = new double[999999]; double resultat[] = new double[999999]; double ee = 0; double aa = 0; double uu = 0; double jj = 0; int cheese =0; double pp = 1;

 for (int lll =0; lll < 1; lll++)

{     for (int yy =0; yy < 999999; yy++) {      ll[yy] = pp;      ll[yy] = ll[yy] +1;      oo[yy]=0;       for (int zz =2; zz < 999997; zz++) {   // qq[yy] = qq[yy] + 1;  //  System.out.print(ll[yy]);    qq[zz] = ll[yy]%zz;  //  System.out.print("\n!"+ll[yy]%zz);    if (qq[zz]==0)    { oo[yy]=oo[yy]+1;  //  System.out.print("Yeah");    //  System.out.print("test"+oo[yy]);    }    if (qq[zz]!=0)    {oo[yy]=oo[yy]+0;}  //  System.out.print("YO"); }        if (oo[yy]==1)         { cheese = cheese +1;                     System.out.print (cheese+"ème chiffre_premier est :"+ll[yy]);   System.out.print ("\n");  resultat[lll] = ll[yy];    if (cheese ==X)    {   System.out.print("la réponse:");        System.out.print("\n");        System.out.print ("le "+cheese+"ème est"+ll[yy]);       break;    }   }pp = ll[yy];    }    //System.out.print("\n");    System.out.print("le chiffre est"+(resultat[lll])); }                 }     }

 

 

 

 

Publicité
Publicité
14 octobre 2019

L'Affaire Aristote et la chute des Corps

 

 L'AFFAIRE ARISTOTE : La chute des corps

(Avertissement : ceci est une proposition d'un blogger passionné plus qu'érudit, en aucun cas, elle ne doit être considérée comme un cours ou une vérité. C'était en effet le sens même d'un blog à sa création. Toute critique est bienvenue).  

      Résultat de recherche d'images pour "aristote" VS  Résultat de recherche d'images pour "galilée"

Aristote contre Galillée, un duel barbant ?

Comment expliquer que deux objets de masses différentes tombent à la même vitesse ?

Vous pouvez tenter l'expérience dans votre salon.

Est ce une impression, est ce une vérité ?

Pour Aristote : "c’est dans la nature des objets lourds de tomber plus rapidement que les objets légers"

Galilée a remis en cause les idées d'Aristote qu'il considère comme une idées reçue par nature (intuitives) (in naturo veritas, qui signifie « la nature donnera la vérité ») et non par l’argumentation ou la logique.

Pour contredire Aristote, il a attaché deux objets.

D’après la loi d’Aristote, le corps lourd attaché au corps léger tombera avant le corps léger attaché au corps lourd car ce corps léger freinera le corps lourd tel un parachute. Le corps lourd attaché au corps léger tombera donc moins vite que le corps lourd seul. La loi d’Aristote prédit donc une chose et son contraire !

(Extraits de wikipedia pour gagner du temps)

 

Nous proposons une solution.

D'abord, l'approche de Gallilée souffre d'un écueil : L'impact.

Les deux objets n'auront certainement pas le même impact sur le sol. Par conséquent la masse de ces objets ne s'annule pas. Cela semble d'ailleurs inconcevable.

 

Argumentation :

 

La loi de l'attraction signifie que 2 objets sont naturellement attirés l'un vers l'autre.

 

L'attraction d'un objet A vers un objet B c'est donc le fait pour A de se déplacer vers B dans un temps donné. Ici on prendra la seconde comme référence.

Nous avons par conséquent 2 éléments qui varient l'un en fonction de l'autre :

Le temps (t) et La distance (d).

La relation entre A et B est la distance (d) qui les sépare à un moment (t) donné en fonction d'un phénomène appelé attraction

 

Bx-Ax = d ; distance (x étant l'emplacement respectif des points A et B sur une droite)

La distance parcourue en 1 seconde de temps des deux objets = (Bx-Mètres)-(Ax+Mètres)

En une seconde l'objet A avance tandis que l'objet B avance en sens contraire.

 

Si on considère que la formule de l'attraction est la relation entre l'évolution de la distance en fonction du temps en fonction d'un phénomène appelé gravité nous pouvons considérer que :

 

Soit s = la seconde

Nous considérons que la différence d'impact signifie que les masses ne s'annulent pas et qu'il faut en tenir compte. 

 

Soit un Objet Q qui se situe à 100 mètres de hauteur :

Sa masse = 10 kg (une balle de plomb)

Soit un Objet P qui se situe à 0 mètres de hauteur :

Sa masse = 100000000000000000000000000000 Kg (on dira qu'il s'agit de la terre)

Relation Q/P = 0,0000000000000000000000001

 

Or, la formule de l'attraction d'un corps est :  masseQ *(Gconstante gravitationnelle/distance)

 

Si l'objet parcourt 100 mètres et si l'on prend un référentiel en seconde.

100 = Distance parcourue par A + Distance parcourue par B en 1 seconde.

En 1 seconde A va exercer une attraction  0,0000000000000000000000001 moins importante que B

 

FORMULE FINALE :

s = secondes.

100 mètres/xsecondes = ((mQ*(G/d))* 0,00000000000000000001% + (99,9999999% * (mP (G/d²))+

((0,00000000000000000001% + 99,9999999% * (mP (G/d²))   (puissanceS-(1*puissance1)))

 

En 100 mètres, Q (le poids de 10 kg) exerce une constante gravitationnelle infime par rapport à P (la terre) et cette différence s'accentue à chaque seconde si bien que la masse de Q semble s'annuler au profit de P.

En résumé :

La différence de poids entre la terre et n'importe quel objet est tellement importante, que tout objet laché en même temps donnera l'impression de toucher le sol au même moment.

L'attraction étant trop forte pour un objet quelqu'en soit sa masse, il donnera l'impression de tomber à la même vitesse qu'un autre beaucoup plus lourd mais très très très relativement léger par rapport à l'attraction terrestre.

La différence sera si infime qu'elle ne pourra pas être vue par un oeil humain et même peut être par un ordinateur.

 

Cette Solution est une proposition en faveur d'Aristote.

Cette vidéo semble avoir balayé cette proposition... à vous de juger.

 

Expérience scientifique sur la loi de la gravité

Le raisonnement humain est intuitif, c'est ce qui le distinguera toujours de l'ordinateur.

Deux corps qui n'ont pas la même masse peuvent-il tomber à la même vitesse ?

Eliminer le frottement de l'air écarte t'il pour autant cette intuition ?

 

 

 

 

22 septembre 2019

Algorithme de mesure de chute d'un corps

Hello,

C'est le Docteur Patchouli, le pote de Satoshi Nakamoto ! (rire)

Aujourd'hui je vous présente un algorithme de mesure de chute que j'ai essayé de mettre au point.

N'étant pas très matheux, j'attends vos commentaires pour améliorer ou corriger mon travail le cas échéant.

Avertissement : J'invite tous les étudiants de 6ème à maths sup à ne pas prendre ce que j'écris comme une vérité.

 

Dans ce programme la hauteur de chute est de 100 mètres mais vous pouvez le modifier. (Je vous laisse deviner où et comment, car c'est une astuce bien pratique qui peut servir dans beaucoup de programmes)

Le référenciel est galiléen (9,81 m/s). Oui, Félix B., si tu me lis, as tu sauté dans le vide ou dans de l'air ?

J'ai donc, comme vous l'avez compris, déjà quelques pistes d'amélioration comme la prise en compte de la gravité en fonction de l'altitude.

 

C'est un programme JAVA très simple à copier coller dans vos cuisines respectives.

 

**  *  * @author user  */ public class BOOK {     /**      * @param args the command line arguments      */     public static void main(String[] args) {        

int te = 0; // temps    

double ta = 0; // valeur en mètres de départ pour une seconde donnée        

double tb = 9.81; // accélération normale sans frottement        

double tc = 0; // valeur cumulée en mètres       

 double td = 0; // valeur finale pour chaque seconde écoulée              

   while (ta + tb < 101)        

{            

tc = ta + tb;           

te = te + 1;           

td = td + tc;        

System.out.print("\n");      

System.out.print ("\n");      

System.out.print (" ");        

System.out.print ("\n");      

System.out.print("        "+te+"       "+td);       

ta=tb;           tb=tc;                  if (td >= 100)          { System.out.print ("   !     "+te+"       "+td);          System.out.print ("\n");          System.out.print ("L'objet atteint 100 mètres après :"+(te-(1-((100-tc)*(1/(td-tc)))))+"   secondes");          System.out.print ("\n");            }     }     }}         

 

Je vous laisse faire vos commentaires. J'attends aussi des idées dans le raisonnement mathématique et surtout de me dire si la réponse vous paraît exacte ou pas.

 

Ce blog se veut un lieu de discussion ouvert et surtout d'apprentissage et d'échange sur des manières de coder.

 

Le prochain défi est de démontrer à l'aide d'un algortihme pourquoi 2 corps de masse différentes tombent à la même vitesse ?

Résultat de recherche d'images pour "docteur d'enfer"     

 

Bonne journée !

 

 

 

 

 

19 juin 2019

Euler et les sacs à dos

Il m'est arrivé d'essayer d'optimiser le remplissage de mon sac à dos en optimisant le poids et le volume de ce dernier. 

Les travaux d'Euler ont alimenté ma réflexion. 

 Jeff Bezos qui rit. Ton idée ne vaut pas 100 briques.

Si mon sac a un volume de 20 et que je veux y mettre les choses les plus lourdes.

Je dispose de deux boîtes : 

Boite 1 : volume = 10 et poids = 10

Boite 2 : volume = 10 et poids = 15

Pour atteindre 20, je  pense qu'il faut additionner 10+10. J'aurais un volume de 20 et un poids de 25. 

J'ai une troisième boîte : 

Son volume est de 10 et son poids de 30

Je peux remplacer la première boîte par cette boîte.

Cela est évident.

Mais comment s'est faite la comparaison. A volume égal, 10, le poids est différent. 

On peut affirmer :

10+30/2 plus grand que 10+15/2

Si j'ai ce problème pour un remplir un container de plusieurs tonnes avec plusieurs milliers de sacs, comment faire ? 

Je me permettrais d'utiliser cette  moyenne un peu biaisée mais je ne sais pas ce que vous en pensez ?

Je prendrais les plus hautes moyennes de mes sacs et de mes poids. 

Je les trierai par ordre décroissant de la plus élevée à la plus petite. 

J'eliminerais ensuite les poids avec les moyennes les moins élevées jusqu'à remonter au volume maximum supporte par mon container (en m'inspirant du fameux Dean Mac de Jean Claude Van Damme dans bloodsport)

 Jean Claude est une source d'inspiration

Cette solution est elle bonne ? 

Je vais vous proposer un exemple de code pour y répondre. Je ne sais pas cependant si le raisonnement est juste ou pas, j'attends vos commentaires à ce sujet.

 

 

19 juin 2019

Débuter en java : comment lancer un programme

Pour passer à cette étape, vous devez avoir d'abord réussi à installer ce que l'on appelle un compilateur. 

Chaque programme à son compilateur. N'allez pas prendre un compilateur PYTHON pour faire du JAVA !

Vous voulez courcircuiter Robocop ? 

 J'ai déjà assez d'emmerdes

Pour le langage Java, ce sera netbeans ou éclipse. 

C'est comme monter un meuble Ikea : très fastidieux. Je vous donne donc rendez vous à l'étape de l'installation.

Si vous avez votre IDE installé, vous pouvez lire ces lignes. Sinon, ce sera une perte de temps.

 

Je répète : télécharger netbeans ou eclipse

Sans compilateur ou IDE, pas de programmation (installer netbeans ou éclipse) : c'est la règle pour tous les langages en principe. 

C'est fait ? 

 

Épineux sujet que celui de démarrer un programme sur java. C'est une partie fondamentale qui inquiète au premier abord. 

En réalité, en dépassant quelques idées reçues, vous allez comprendre que c'est extrêmement simple. 

D'abord, regardez les lignes de code comme ce quelles sont : UN NON SENS. Il n'y a pas de logique cachée, alors ne vous inquietez, dites vous que l'ordinateur ne vous comprend pas et pas l'inverse, cela vous évitera des malentendus ou de mauvais souvenirs d'écolier pour les prochaines étapes.

Nous allons dire "bonjour". Lorsque vous dites bonjour, personne ne s'inquiète de savoir d'où vient ce terme ou quelles sont ses origines. Alors décomplexez vous !  

Voici le code à copier sans se poser de questions étymologiques et faire travailler ses méninges. Les instructions sont ce qu'elles sont... Des instructions. N'y cherchez pas du sens pour l'instant. 1+1=2 sauf pour les docteurs en maths et Jean Claude Vandamme, mais vous n'en êtes pas pour l'instant. 

public class {

         public static vous main (String[ ] args)

               {

                System.out.print ("bonjour");

                }

}

 

Les gouttes perlent sur votre front, l'ordinateur a mouliné une fraction de seconde et.. bonjour s'affiche. 

Tous les programmeurs, vous le diront, si tu sais dire bonjour, tu sais tout faire ou presque.

Tout ce qui se trouve avant et après System.out.print("..."); est la  base de tout programme JAVA. Ne cherchez pas à comprendre le sens de ces mots. Lewis Hamilton ne sait probablement pas de quoi un moteur est fait. Contentez vous de le reproduire. 

Le programmeur ne fait pas de l'ethymologie.

A l'intérieur de ce moteur vous allez y glisser votre code. 

Prenons bonjour : 

C'est un mot. Vous auriez pu dire Hello, ciao, l'auteur de blog est très beau etc...

etc.. 

Pour exprimer un mot, il faut la bonne grammaire : 

Les " et les ( ) ;

(" Votre mot ");

Chaque fois que vous exprimez un mot vous devez l'accompagner de cette grammaire. COMPRIS ?

C'est comme cela et pas autrement. C'est une étape à comprendre quand on débute. On pourrait croire qu'il y a du sens en se référant à du langage mais ce serait une perte de temps, surtout quand les instructions vont devenir plus complexes. Ne confondez pas raisonnement (ma pensée) et instructions (comment la transmettre à l'ordinateur).

Dans notre exemple, pour dire bonjour (ma pensée) je dois écrire l'instruction system.out.print et la grammaire. 

System.out.print ("bonjour");

Maintenant vous pouvez magner des phrases, il vous suffit de connaître ou d'aller chercher la bonne grammaire... (Google)

aller à la ligne :  \n

un espace de tabulation : \t

Si je veux écrire :

Brad

                         Pitt

System.out.print("Brad");

System.out.print("\n");

System.out.print("\t");

System.out.print("pitt");

Si cette façon de travailler vous a paru pertinente, vous pouvez approfondir, en lisant l'ouvrage JAVA pour les nuls qui est une très bonne porte d'entrée pour débuter

 Stupéfiant !

 

 

Publicité
Publicité
Java Machine Learning & IA Think Tank
  • Je souhaite partager mes idées, réflexions autour de la programmation, transmettre quelques astuces. La passion n'excuse pas l'ignorance, mais elle peut réduire la distance qui la sépare de la connaissance.
  • Accueil du blog
  • Créer un blog avec CanalBlog
Publicité
Java Machine Learning & IA Think Tank
Archives
Visiteurs
Depuis la création 119
Newsletter
Publicité