Un logiciel pour programmer des trucs simples

Hello la zone,

Voilà, là j’ai un petit problème de math posé par une élève de troisième.
[MODE=PETITE_HISTOIRE ON]
Cette élève a remarqué que 36 a autant de diviseurs que la somme de ses chiffres, c’est à dire 9, et elle m’a demandé s’il y avait beaucoup d’autres nombres avec cette propriété. Sur le coup j’ai trouvé 1,2, 11, 101, puis en cherchant un peu plus y a 22 et 202 aussi… Mais voilà, maintenant j’aimerais aller plus loin parce que j’ai pas été foutu d’en trouver d’autres. Et j’aimerai bien savoir s’il y en a une infinité, ou pas, bref autant de trucs qu’un prof de maths se pose et qui intéressent que lui :slight_smile:
[MODE=PETITE_HISTOIRE OFF]

Donc j’aimerais programmer un petit truc pour trouver ces nombres.
D’ordinaire je le fais sur ma calculatrice, mais c’est lent et puis bon la laisser tourner toute la nuit ça bousille les piles.

Donc j’aimerais le programmer sur PC.
Sauf que j’ai pas de logiciel pour ça. Je maitrise pas assez Excel pour le faire sur Excel (et je doute que ça soit faisable dessus en plus).

Donc question : avez-vous connaissance d’un logiciel qui permette de programmer ce genre de chose, facile à prendre en main (c’est pour utiliser occasionnellement pour ce genre de problèmes, donc j’ai pas envie d’avoir à me fader 500 pages de doc pour ça).
L’idéal ce serait d’avoir le même que sur ma TI-89 qui tourne sur PC, mais là je rêve évidemment (je peux écrire des programmes su mon PC pour la TI, mais je ne peux pas les faire tourner).

Je pensais à un programme de Pascal, ou du Basic évolué… Le tout gratuit.

Scilab : http://www.scilab.org/
Pas de calcul formel mais pour jouer avec des nombres entiers ça suffira largement.
Le langage est le même que celui de Matlab :slight_smile:

Edit rapide : c’est moins rapide que du c mais ça s’installe d’un click sur un windows et c’est plus souple :crying:

[quote=« olivarius, post:2, topic: 48266 »]Scilab : http://www.scilab.org/
Pas de calcul formel mais pour jouer avec des nombres entiers ça suffira largement.
Le langage est le même que celui de Matlab :crying:

Edit rapide : c’est moins rapide que du c mais ça s’installe d’un click sur un windows et c’est plus souple :cry:[/quote]J’allais le proposer. Il faut s’habituer au fonctionnement de l’engin mais c’est quand même assez simple. Si tu cherches des exemples numériques ça t’en trouvera vite fait.

Et en plus ça peut servir à des tas d’autres trucs mathématiques. :slight_smile:

Ah ben merci bien je teste ça ce soir ! :slight_smile:

Après jette toi sur Mathematica et ça sera le pied :slight_smile:

Mathematica c’est payant.
Sinon pour les soft de calcul formel : http://fr.wikipedia.org/wiki/Logiciel_de_calcul_formel

Sinon il y a des émulateurs de TI89 sur pc :slight_smile:

Mapple :sunglasses:

Non plus sérieusement, (quoi que…) python me semble être un bon langage pour ce genre de choses simples.
Il suffira de créer un dictionnaire de nombre de diviseurs, d’itérer de 10 à 100000000 par exemple et pour chaque chiffre (obtenu par substitution de chaine, ou par division / modulo) de les sommer, de voir si la somme est dans le dictionnaire (pour éviter de le calculer), ou de le calculer sinon, et en cas de succes, d’ajouter ce nombre à la liste des « nombres verifiants cette hypothese »; qui sera retournée à la fin du programme.
un cours de python en pdf très cool, que tu pourra facilement lire entre les lignes.

Bon courage !

Moi je recommande Lua, je pense que y’a pas plus simple comme langage générique. Et si tu veux un cours sur Lua, attends que j’aie fini de l’écrire :slight_smile:

Bonjour, je voudrais vendre du ruby (le langage sympa qu’il est rigolo à l’apprendre). A l’arrache:
http://pastie.org/private/pdr2nrc70fcn5ol3q1myxa (vérifie si un nombre correspond)
et
http://pastie.org/private/3qqusspbysas7szluqbow (prend deux nombres comme arguments et donnera la liste de tous les nombres entre ces deux-ci et correspondant à la demande )

Bon, 3h pour le faire, mais je suis arrivé à ce que je voulais.
Ceux qui veulent tester :

UT=evstr(x_dialog(‹ A partir de quel nombre ? ›,’’)); //On entre un entier quelconque
t=1;
result=zeros(1,100); //le tableau des résultats (100 nombres)
A=UT;
while t<>101, // tant que le tableau de résultats n’est pas rempli
La=length(string(A)); //on prend la longueur du nombre à tester
Sa=0;
NOMBRE=A;
for i=1:La, //boucle qui fait la somme des chiffres du nombre
G=10**(La-i);
M=int(A/G);
Sa=M+Sa;
A=A-MG;
end, //La somme des chiffres sera contenue dans Sa
B=factor(NOMBRE); //on factorise le nombre en facteur de nombre premier
L=length(B ); //on regarde la longueur du tableau de nombres premiers obtenu
P=ones(1,L); //Le tableau P contiendra les puissances des facteurs premiers
P(1)=2; //Au début P est rempli de 1.
for i=2:L, //Boucle qui rempli P : la puissance est 2 dès qu’un nouveau facteur premier apparait
if B(i)<>B(i-1) then P(i)=2; //1 sinon.
end, //Exemple avec 1000 : B[2,2,2,5,5,5]
end, //Et donc P[2,1,1,2,1,1]
nd=1;
Sum=2;
for i=2:L, //cette boucle calcule le nombre de diviseurs du nombre testé.
if P(i)==1 then Sum=Sum+1; //Le nombre de diviseurs d’un nombre est calculé en faisant le produit
else nd=nd
Sum; //des puissances des facteurs premiers qui le décomposent + 1
Sum=2; //Exemple avec 1000=2^35^3 : nombre de diviseurs : 44=16
end,
end,
nd=nd*Sum; //Le nombre de diviseur est contenu dans nd
if Sa==nd, //Si le nombre de diviseur = somme des chiffres
result(t)=NOMBRE; //On met le résultat dans le tableau.
t=t+1;
end,
A=NOMBRE+1; //On recommence avec l’entier suivant.
end,
result //On affiche le tableau des résultats

Ca donne les 100 premiers nombres qui vérifient la propriété à partir d’un nombre donné. Par exemple à partir de 0 il y a 1, 2… jusqu’à 3588.
C’est surement codé avec les pieds, ça fait longtemps que j’ai pas fait de tels truc donc j’ai pas optimisé. Si certains ont des solutions plus rapides, je prends. Parce que j’aimerai bien montrer le résultat aux gamins.
Y a peut-être des fonctions qui font déjà certains trucs d’ailleurs :

  • une fonction qui fait la somme des chiffres d’un nombre (j’ai pas trouvé).
  • une fonction qui prend la partie décimale d’un nombre (y a 4 fonctions différentes pour la partie entière, mais pas décimale !).

Au final ça permet de voir qu’il y en a plus que ce que je pensais ! C’est intéressant !

Maintenant, faut s’attaquer à la théorie :slight_smile:

T’as fait ça avec Scilab finalement ? J’ai pas regardé en détail ton code, mais j’espère que t’as fait gaffe avec les opérateurs : la multiplication de base c’est la multiplication matricielle (pareil pour la division).
Je me suis fait avoir plus d’une fois comme ça dans mes calculs. :slight_smile:

Edit : typo

J’ai mis 3h tout compris (donc à partir du moment où j’ai téléchargé Scilab). Il a fallu chercher la syntaxe, puis les fonctions qui m’intéressaient. J’ai mis du temps à piger qu’il était sensible à la casse aussi (j’ai pesté 15 minutes parce que je comprenais pas pourquoi il ne faisait pas mon For alors qu’il fallait écrire for…).

Mais sinon mon code marche hein, c’est juste que je ne sais pas s’il est optimisé ou pas.

[quote=“FMP_thE_mAd, post:13, topic: 48266”]J’ai mis 3h tout compris (donc à partir du moment où j’ai téléchargé Scilab). Il a fallu chercher la syntaxe, puis les fonctions qui m’intéressaient. J’ai mis du temps à piger qu’il était sensible à la casse aussi (j’ai pesté 15 minutes parce que je comprenais pas pourquoi il ne faisait pas mon For alors qu’il fallait écrire for…).

Mais sinon mon code marche hein, c’est juste que je ne sais pas s’il est optimisé ou pas.[/quote]Je te crois, j’ai juste jeté un coup d’œil comme ça. Après pour l’optimisation… Le seul truc que je sais pour Matlab (donc je suppose que c’est pareil pour scilab) c’est que quand c’est possible il faut éviter les boucles for et faire directement les calculs sur des matrices à la place. À part ça je peux pas trop aider.