Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#251 06-10-2019 10:40:57
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
LEG : sois poli et respectueux toi-même.
Dernière modification par cosinuspax (06-10-2019 10:45:50)
Hors ligne
#252 06-10-2019 12:20:39
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
Re,
GOTO est une instruction issue du langage BASIC.
J'ai commencé à programmer... en BASIC à l'occasion du Plan Informatique pour tous... Ça ne date pas d'ajourd'hui
Avec mon Amstrad CPC 6128 en BASIC Locomotive,
Puis pour un copain prof de Cuisine en LEP, avec le BASIC des machines de bureau Amstrad PCW
Puis pour autre copain, astrologue, j'ai enrichi son programme d'Astrologie de fonctions supplémentaires avec BASIC GFA des ATARI et AMIGA.
Puis j'ai utilisé le Quick Basic et enfin le Turbo Basic de Borland dans lequel j'ai traduit :mon p^rogramme de calculs d'éclipsesz
mon programme de conjugaison
mes programmes de carrés magiques
mon programme de calculs d'intérêts de prêts, de placements,
le programme d'Astrologie
mon programme de calculs d'éclipses lunaires et solaires...
J'abrège...
Tu vois les BASIC, je connais...
Maintenant je travaille en Python...
Et tu m'avais écrit aussi : si tu veux que je comprenne ce qu'est un sous-programme, il faut me donner un exemple...
Mais cette demande a sauté...
Je te réponds quand même : rien que dans ce fil tu as plusieurs exemples.
Mon dernier en date qui répond aux questions données par son prof de Maths à Tania...
#!/usr/bin/env python
# coding: utf-8 -*-
from math import log
def titre():
print(" ***********************************")
print(" * Variations sur le nombre *")
print(" * de *")
print(" * David Champer *")
print(" * (v. 3.1) *")
print(" ***********************************")
print ("\n\nNombre de David Champer :")
print(" 0,123456789101112131415161718192302122232425627282930...")
def cherche_position():
######## Inscrire ci-dessous la position du chiffre à rechercher #########
n=int(input(" Entrer la position du chiffre à rechercher : "))
##########################################################################
print("\n\n")
i,lg=1,0
while not lg>=n:
lg+=int(log(i,10))+1
i+=1
lg_i=int(log(i,10))+1
ecart = lg-n
print("+-+ Le "+str(n)+"e chiffre décimal est",str(i)[lg_i-ecart-1],"+-+")
return
def somme_des_premiers_chiffres():
######## Inscrire ci-dessous le nombre de chiffres à additionner #########
nc=int(input(" Entrer le nombre de chiffres à additionner : "))
##########################################################################
print("\n\n")
i,nb_chiffres,S,stop=1,0,0,0
print("+-+ La somme des",nc, "premiers chiffres décimaux est :",end=" ")
while not stop:
lg_i=int(log(i,10))+1
for x in range(lg_i):
nb_chiffres+=1
if nb_chiffres<=nc:
S+=int(str(i)[x])
else:
stop=1
break
i+=1
print (S,"+-+\n\n")
return
def ajout_devant(ch,CHD,cas):
Vide=[]
for i in range (1,10):
if cas==0:
print(" --> ",str(i)+ch)
CHD.append(str(i)+ch)
else:
Vide.append(str(i)+ch)
return CHD,Vide
def ajout_fin_de_chaine(ch,CHF,cas):
Vide=[]
for i in range (0,10):
if cas==0:
print(" --> ",ch+str(i))
CHF.append(ch+str(i))
else:
Vide.append(ch+str(i))
return CHF,Vide
def affiche_4_colonnes(CH,lg,a,b):
for i in range(9+a):
print(" ",end=" ")
for j in [0,1,2,8+b]:
if j==2:
print("."*(lg),end=" "*(j<9))
else:
print(CH[j][i],end=" "*(j<9))
print()
def Zero(ch):
print ("\n La chaîne",ch,"commençant par 0, on ne peut lui ajouter de chiffre(s) à la fin.")
def cherche_chaine():
######## Inscrire ci-dessous la chaîne à rechercher #########
ch=input(" Entrer la chaîne à rechercher : ")
#################################################################################
print("\n\n")
print (" +-+ Recherche de toutes les occurences de la chaîne", ch,"+-+\n")
lch=len(ch)
ln_ch=lch-1
d=ch[0]+","
print("Le premier chiffre étant un",d,end=" ")
if ch[0]!="0":
print("le nombre", ch, "qui possède", lch,"chiffres est déjà une réponse en lui-même.")
else:
print ("il n'y a aucun nombre à", lch,"chiffres, qui soit solution.")
print ("\n ** Réponses incluses dans des nombres à",lch+1,"chiffres **\n")
print ("(1) En ajoutant un chiffre de 1 à 9 en début de chaîne :")
CHD,CHF=[],[]
CHD,Vide=ajout_devant(ch,CHD,0)
if ch[0]!="0":
print ("\n(2) En ajoutant un chiffre de 0 à 9 en fin de chaîne :")
CHF,Vide=ajout_fin_de_chaine(ch,CHF,0)
else:
Zero(ch)
print ("\n ** Réponses incluses dans des nombres à",lch+2,"chiffres. **\n")
print (" En ajoutant un chiffre de 1 à 9 en début de chacune des 9 solutions de (1),")
print("soit 81 réponses de plus...)")
HD1=[]
for i,chd in enumerate(CHD):
CHD,Vide=ajout_devant(chd,CHD,1)
HD1.append(Vide)
affiche_4_colonnes(HD1,lch+1,0,0)
if ch[0]!="0":
print ("\n En ajoutant un chiffre de 0 à 9 en fin de chacune des 10 solutions de (2),")
print ("soit 100 réponses supplémentaires...")
HF1=[]
for i,ch in enumerate(CHF):
CHF,Vide=ajout_fin_de_chaine(ch,CHF,1)
HF1.append(Vide)
affiche_4_colonnes(HF1,lch+1,1,1)
else:
Zero(ch)
print("\nToujours avec", lch+2,"chiffres, on peut aussi ajouter chacun des chiffres de 0 à 9 en fin")
print("de chacune des 9 solutions de (1), soit encore 90 réponses supplémentaires...\n")
HF1=[]
for i,chd in enumerate(CHD):
CHF,Vide=ajout_fin_de_chaine(chd,CHF,1)
HF1.append(Vide)
affiche_4_colonnes(HF1,lch+2,1,0)
print("\nOn peut poursuivre ce même procédé à l'infini avec,",str(lch+3)+",",str(lch+4)+",",str(lch+5)+" etc.. chiffres...")
return
titre()
Dico_fonctions={"1":cherche_position,"2":somme_des_premiers_chiffres,"3":cherche_chaine}
while True:
print("\n\n\n")
print (" *** Voulez-vous ***")
print()
print (" 1. Rechercher un chiffre connaissant sa position")
print (" 2. Connnaître la somme des n (quantité à donner) premiers chiffres")
print (" 3. Rechercher toutes les occurrences d'une chaine à donner")
print ()
print (" 0. Quitter le programme")
print()
print (" ",end=" ")
chx=input("Votre choix : ")
print("\n")
if chx=="0":
print (" Au revoir !")
break
elif chx in["1","2","3"]:
Dico_fonctions[chx]()
else:
pass
Phase 1
Démarrage : que voit-on ?
Ceci :
* Variations sur le nombre *
* de *
* David Champer *
* (v. 3.1) *
***********************************
Nombre de David Champer :
0,123456789101112131415161718192302122232425627282930...
*** Voulez-vous ***
1. Rechercher un chiffre connaissant sa position
2. Connaître la somme des n (quantité à donner) premiers chiffres
3. Rechercher toutes les occurrences d'une chaine à donner
0. Quitter le programme
Votre choix :
J'appuie sur 1, que se passe-t-il ?
Je rentre dans le sous-programme cherche_position : je n'ai pas à fournir de paramètres, il est auto-suffisant et n'a pas besoin de me fournir de résultats, simplement de me ramener à l'endroit d'où je suis parti, c'est à dire après que j'ai appuyé sur 1...
A l'intérieur du sous-programme, il demande à quelle position, il doit commencer à chercher, après il travaille seul...
Et de retour dans mon programme principal qui commence à titre() qui est un sous-programme qui ne fait rien d'autre que d'écrire le titre et le nombre de David Champer.
N-B : il y a cloisonnement. De retour dans mon programme principal : les résultats des calculs sont restés au chaud dans le sous-programme, il n'a rien retourné...
Si j'avais tapé 2 ( Votre choix : 2), je serais rentré dans le sous-programme somme des premiers chiffres qui m'aurait demandé combien et fait le calcul :
Entrer le nombre de chiffres à additionner : 2069
+-+ La somme des 2069 premiers chiffres décimaux est : 8718 +-+
Si te tape 3 :
Entrer la chaîne à rechercher : 15071972
+-+ Recherche de toutes les occurences de la chaîne 15071972 +-+
Le premier chiffre étant un 1, le nombre 15071972 qui possède 8 chiffres est déjà une réponse en lui-même.
** Réponses incluses dans des nombres à 9 chiffres **
(1) En ajoutant un chiffre de 1 à 9 en début de chaîne :
--> 115071972
--> 215071972
--> 315071972
--> 415071972
--> 515071972
--> 615071972
--> 715071972
--> 815071972
--> 915071972
(2) En ajoutant un chiffre de 0 à 9 en fin de chaîne :
--> 150719720
--> 150719721
--> 150719722
--> 150719723
--> 150719724
--> 150719725
--> 150719726
--> 150719727
--> 150719728
--> 150719729
** Réponses incluses dans des nombres à 10 chiffres. **
En ajoutant un chiffre de 1 à 9 en début de chacune des 9 solutions de (1),
soit 81 réponses de plus...)
1115071972 1215071972 ......... 1915071972
2115071972 2215071972 ......... 2915071972
3115071972 3215071972 ......... 3915071972
4115071972 4215071972 ......... 4915071972
5115071972 5215071972 ......... 5915071972
6115071972 6215071972 ......... 6915071972
7115071972 7215071972 ......... 7915071972
8115071972 8215071972 ......... 8915071972
9115071972 9215071972 ......... 9915071972
En ajoutant un chiffre de 0 à 9 en fin de chacune des 10 solutions de (2),
soit 100 réponses supplémentaires...
1507197200 1507197210 ......... 1507197290
1507197201 1507197211 ......... 1507197291
1507197202 1507197212 ......... 1507197292
1507197203 1507197213 ......... 1507197293
1507197204 1507197214 ......... 1507197294
1507197205 1507197215 ......... 1507197295
1507197206 1507197216 ......... 1507197296
1507197207 1507197217 ......... 1507197297
1507197208 1507197218 ......... 1507197298
1507197209 1507197219 ......... 1507197299
Toujours avec 10 chiffres, on peut aussi ajouter chacun des chiffres de 0 à 9 en fin
de chacune des 9 solutions de (1), soit encore 90 réponses supplémentaires...
1150719720 2150719720 .......... 9150719720
1150719721 2150719721 .......... 9150719721
1150719722 2150719722 .......... 9150719722
1150719723 2150719723 .......... 9150719723
1150719724 2150719724 .......... 9150719724
1150719725 2150719725 .......... 9150719725
1150719726 2150719726 .......... 9150719726
1150719727 2150719727 .......... 9150719727
1150719728 2150719728 .......... 9150719728
1150719729 2150719729 .......... 9150719729
On peut poursuivre ce même procédé à l'infini avec, 11, 12, 13 etc.. chiffres...
Alors ce sous-programme délègue une part de son travail à différents sous-programmes de calcul et d'affichage :
ajout_devant
ajout_fin_de_chaine
affiche_4_colonnes : c'est lui seul (!) qui m'a occupé hier (je n'avais pas les idées claires).
Ils sont conçus pour s'adapter à différentes configurations, donc réutilisables (et réutilisés à quelques reprises dans le sous-programme appelant)...
Par contre les instructions utiliséers ne sont pas évidentes à comprendre du premier coup, c'est normal...
Au départ, pour Tania, j'avais bâti 3 morceaux indépendants qui utilisaient un nombre de David Champer contenant tous les nombres de 1 à 9999...
impossible d'y rechercher la chaine de sa date naissance 06082004,
Impossible de demander un ciffre d'une position supérieure à 38889,
Impossible de demander la somme des 40000 premiers chiffres...
J'avais donc décidé de faire un 3 en 1, avec ajout d'un menu, et de me passer de la construction du nombre de DC...
C'est l'affichage que je voulais obtenir pour la recherche de chaîne qui m'a bien arrêté : avec l'outil de base livré avec Python pour écrire les programmes et les tester, à partir dfu moment où j'ai écrit sur une ligne je ne peux pas dire au programme de revenir sur la même ligne...
Donc si je je veux des colonnes, je ne peux pas les remplir à la volée, je dois les construire avant...
De plus jen voulais 2, puis des pointillés et enfin la dernière et que ça marche dans tous les cas de figure...
Une programmation structurée est un gage d'évolutivité, de plus le débogage s'en trouve facilité : on arrive plus vite à trouver le coupable en cas de dysfonctionnement, reste ensuite à corriger.
De plus ces sous-programmes peuvent être repris et adamptés dans des programmes : comme des pièces de meccano...
Je vais me repencher sur ton truc...
43 j = 1
44 Tant que W < Q alors W = W x 3
Voilà qui part d'un bon sentiment...
Ta boucle tant que a donc un test d'arrêt. C'est un bon point...
Toutefois dans les langages autre Python, la boucle Tant Que comporte une mention de fin :
EXIT LOOP, EXIT WHILE, Fin Tant que...
En Python, c'est inutile : c'est le rôle de l'indentation. Exemple (un peu bébête, je sais...)
i=10
while i//25 != 1:
i=i+2
print("i =",i)
print ("La condition n'était plus vérifiée, je suis sorti de la boucle !")
que se passe-t-il ?
Je suis pas à pas :
1 i =10
2 Tant que i//25 != 1 : 10//25 = 0. Je rentre donc dans la boucle :
3 i=i+2
4 i = 12 Affichage du résultat
5 Tant que i//25 != 1 : 12//25 = 0. Je rentre donc dans la boucle :
6 i=i+2
7 i= 14
....
j'arrive à
i = 26
Tant que i//25 != 1: Ici 26//25 = 1 donc le quotient entier n'est plis différent de 1 mais égal ! Je sors et j'écris :
La condition n'était plus vérifiée, je suis sorti de la boucle !
Ça c'est le déroulement à la main.
Que voit-on quand on le lance ? Ceci :
i = 14
i = 16
i = 18
i = 20
i = 22
i = 24
i = 26
La condition n'était plus vérifiée, je suis sorti de la boucle !
!
Et si je modifie l'indentation du print ("i =",i), comme ceci :
i=10
while i//25 != 1:
i=i+2
print("i =",i)
print ("La condition n'était plus vérifiée, je suis sorti de la boucle !")
Quelle différence ? Le print ("i =",i) n'est plus dans la boucle : il n'affiche i = (valeur de i) qu'une seule fois :
La condition n'était plus vérifiée, je suis sorti de la boucle !
Vois-tu ce que je veux dire quand je parle de fin de boucle while ?
Et ton Next i en BASIC jouait le même rôle la condition portait sur i et était implicite :
FOR i = Debut TO fin
Instructions
NEXT i
On pouvait même, en séparant les instructions par : bourrer les lignes numérotées jusqu'à 255 caractères alphanumériques...
C'était rapidement illisible : j'ai écrit des prog Basic dans les années 80 que j'ai maintenant le plus grand mal à comprendre...
Donc, ta boucle TANT QUE W ne comporte pas d'indication visible de Retour à la case départ ( i. e Tant que W...)
En fin de ligne 74 ?
Sinon j'ai trouvé un 2e sous-programme de 5 lignes (répété 4 fois), en plus des 2 précédents...
Reste à voir comment les intégrer.
Je continue...
@+
[EDIT]
34 Si A > B, alors A = B
Si A > B alors A prend la valeur de B Et que devient B ?
S'il ne change pas, alors cela revient à continuer à chercher l'alignement de nombres A et B égaux...
Normal ?
Dernière modification par yoshi (06-10-2019 16:08:06)
Hors ligne
#253 07-10-2019 10:35:38
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
Bonjour
@Yoshi:
Si A > B alors A prend la valeur de B Et que devient B ?
Ca n'a que peu d'importance pour vérifier l'alignement de A,B et le produit P, en partant de la valeur d'origine, que tu multiplies P par T , ou A par T , ou encore B par T c'est du pareil au même .....à la base où il n'y a qu'une condition d'alignement : les trois critères qui vérifient A,B et P...§
Si par la suite tu rajoutes des conditions d'alignement ....quel serait le but d'alignement d'origine ?
voila ton exemple page 8 post #190 que tu as détaillé avec les valeurs : i,e,v,t...etc
voici les deux tests tu remarqueras que le temps est quasiment linéaire :
test 1)
*************************************************
* Alignements progressif de produits *
* Idée : cosinuspax *
* v.2 *
*************************************************
*** Début du programme ***
A0 = 73
B = 3692347
P = 269541331
résultat:
P = 9433946585
A = 2555
B = 3692347
*******************
Temps écoulé : 0.09 s soit : 0 min 0.09 s
>>>
test 2)
RESTART: E:\\Crible.Programe Yoshi-Cosinuspax.py
*************************************************
* Alignements progressif de produits *
* Idée : cosinuspax *
* v.2 *
*************************************************
*** Début du programme ***
A0 = 45413
B = 3507065749624756498911323
P = 159266376887709066885059911399
résultat:
P = 77027314874113107478158991641287681822487280899
A = 21963464723281779041913
B = 3507065749624756498911323
*******************
Temps écoulé : 0.08 s soit : 0 min 0.08 s
>>>
donc que tu multiplies uniquement A par T, avec A < B et des-que A devient > B, et bien tu inverse et tu multiplies B par T mais avec le T en court....inférieur à 49 ,etc etc puis V = 7 multiplié par 9^x>0 donnera T , et T * A ou B en court......etc..etc,jusqu'au résultat tel que ci-dessus....
Et à chaque fois que A ou B devient supérieur à l'autre et bien inverse....!
Car de toutes les façons le produit P d'origine il y a longtemps que A et B ne seront plus deux facteurs premiers simultanément.
Il n'y a qu'au début , lors du premier choix que A et B doivent être premiers...
Je pense d'ailleurs que si tu t'amuses à modifier le programme lorsque A >b alors break et on inverse B *T en court tant que B< A ou tant que A<B on mulitplie par le T en court ....sans rien changer aux valeurs de e,v,t...avec T < = 49, pour V = 7 puis réitération V * 9^x donnera T = 63 qu'il multipliera soit A soit B tant que les 3 conditions d'alignement ne sont pas vérifiées .....etc etc.
pour moi : il n'y a que cette inversion à modifier si A > b alors B*T et on continue tant que B< A puis à nouveau si B > A , alors A*T tant que les 3conditions ne sont pas vérifiées soit: L < P avec A et B > S stop ! ....Non ?
car cela ne sert à rien de repartir avec T = 1 lorsque A > B où B devient B0 c'est absurde à mon avis , facile à vérifier...et je me demande même si cela sert à quelque chose d'inverser...
puisque dans les tests que j'ai fait ou que tu as fait dans le résultat final, on a bien l'alignement mais avec A > B....
Dernière modification par LEG (07-10-2019 10:46:40)
Hors ligne
#254 07-10-2019 11:08:19
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
voici 3 tests avec A et B premiers au départ:
*************************************************
* Alignements progressif de produits *
* Idée : cosinuspax *
* v.2 *
*************************************************
*** Début du programme ***
A0 = 877
B = 881
P = 772637
P = 772637
A = 877
B = 881
P = 5408459
A = 6139
B = 881
*******************
Temps écoulé : 0.08 s soit : 0 min 0.08 s
>>>
RESTART: E:\\Crible.Programe Yoshi-Cosinuspax.py
*************************************************
* Alignements progressif de produits *
* Idée : cosinuspax *
* v.2 *
*************************************************
*** Début du programme ***
A0 = 881
B = 6139
P = 5408459
P = 5408459
A = 881
B = 6139
P = 37859213
A = 6167
B = 6139
*******************
Temps écoulé : 0.08 s soit : 0 min 0.08 s
>>>
RESTART: E:\Crible.Programe Yoshi-Cosinuspax.py
*************************************************
* Alignements progressif de produits *
* Idée : cosinuspax *
* v.2 *
*************************************************
*** Début du programme ***
A0 = 6139
B = 6167
P = 37859213
P = 37859213
A = 6139
B = 6167
P = 795043473
A = 128919
B = 6167
*******************
Temps écoulé : 0.11 s soit : 0 min 0.11 s
on a bien L<P, A > S et B > S .... pour P = 37859213 .
ou encore :
Pour P = 795043473 et bien on a L < P et A et B > S....stop print...
P = 795043473
A = 128919
B = 6167
Hors ligne
#255 07-10-2019 12:26:48
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
k est maintenant défini par la boucle j.
41 Q = T / V
42 W = 3
43 j = 1
44 Tant que W < Q alors W = W x 3 : j = j + 1
45 k = j
47 m = - 1
48 m = m + 1
49 Si m > k, aller à 61
50 A = 3^m x A0
51 B = T / A
52 Si P > S^2, si A >= S, si B >= S, aller à 54 (aligné à priori).
53 Sinon, si A ou B < S, aller à next m (48).
54 Si A > B, alors A = B et B = A
55 A - S = C
56 Si C = 0 alors print P, A et B. STOP.
57 D = sqrt entière de C
58 F = D^2 + D + S
59 Si A = F alors print P, A et B. STOP (aligné probable).
60 Si A différent de F, aller à next m (48).
61 n = - 1
62 n = n + 1
63 Si n > k, aller à next i.
64 A = (3^n x V) x A0
65 B = T / A
66 Si P > S^2, si A >= S, si B >= S, aller à 68 (aligné à priori).
67 Sinon, si A ou B < S, aller à next n (62).
68 Si A > B, alors A = B et A = B
69 A - S = C
70 Si C = 0 alors print P, A et B. STOP.
71 D = sqrt entière de C
72 F = D^2 + D + S
73 Si A = F alors print P, A et B. STOP (aligné probable).
74 Si A différent de F, aller à next n (62).
Dernière modification par cosinuspax (07-10-2019 13:53:03)
Hors ligne
#256 07-10-2019 12:37:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
Bonjour,
J'ai besoin de réponses courtes et claires à mes questions :
Question 1
16 Si P = N, alors si P > S^2, si A >=S, si B >= S, aller à 20.
17 Sinon, si A ou B < S
Si je résume et simplifie, laquelle des deux interprétations est la bonne ?
Si P = N
| SI P>=S²
| | Si A>=S et B >=S
| | | aller à 20
| | FIN SI
| FIN SI
SINON si A<S et B<S
| Next i
FIN SI
OU
Si P = N
| SI P>=S²
| | Si A>=S et B >=S
| | | aller à 20
| | SINON si A<S ou B < S
| | | Next i
| | FIN SI
| FIN SI
FIN SI
Question 2
Je t'ai écrit
43 j = 1
44 Tant que W < Q alors W = W x 3Voilà qui part d'un bon sentiment...
Ta boucle tant que a donc un test d'arrêt. C'est un bon point...
Toutefois dans les langages autre Python, la boucle Tant Que comporte une mention de fin :
EXIT LOOP, EXIT WHILE, Fin Tant que...
En Python, c'est inutile : c'est le rôle de l'indentation
(...)
Donc, ta boucle TANT QUE W ne comporte pas d'indication visible de Retour à la case départ ( i. e Tant que W...)
En fin de ligne 74 ?
Question 3
Je t'ai écrit :
34 Si A > B, alors A = B
Si A > B alors A prend la valeur de B Et que devient B ?
S'il ne change pas, alors cela revient à continuer à chercher l'alignement de nombres A et B égaux...
Normal ?[
Question 4
18 Si P > N et si T < 63, aller à 26.
19 Si T >= 63, aller à 41.
Peut-on intervertir ces deux lignes ?
J'ai une piste de programmation : à l'intérieur de la 2e boucle (cf version 2) introduire 3 boucles enchassées...
Mon problème est le même que le précédent : jusqu'où iraient-elles ?
Et corollaire : définir les conditions de sortie de chacune d'elles...
@+
[EDIT] Je vois ta réponse : tu as toujours autant de mal à répondre aux questions posées bien avant ma précédente réponse.
J'ai donc bien fait de les reposer et d'en reposer d'autres.
En attendant lesdites réponses, je passe à autre chose...
En ligne ? Kézaco ?
Dernière modification par yoshi (07-10-2019 12:42:09)
Hors ligne
#257 07-10-2019 12:41:57
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Re Yoshi, j'ai corrigé en fonction de ton exemple Python. Puisqu'on sort automatiquement, pas besoin de SI W = Q alors k = j.
Si A > B alors B = A.
C'est à dire que B est testé en tant que A jusqu'à 60 (pour m) et jusqu'à 74 (pour n). Si le résultat est différent de F on change de m ou de n et un nouveau B fait automatiquement son apparition puisqu'un nouveau produit est abordé.
Merci pour tes démos en python, mais cela demande une bonne initiation avant de pouvoir s'y retrouver (c'est simple pour toi, pas forcément pour celui qui découvre !).
Hors ligne
#258 07-10-2019 12:47:03
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
On arrive.
Hors ligne
#259 07-10-2019 13:08:37
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
oncRE,
Merci pour tes démos en python, mais cela demande une bonne initiation avant de pouvoir s'y retrouver (c'est simple pour toi, pas forcément pour celui qui découvre !).
Concernant le nombre de David Champer
Par contre les instructions utilisées ne sont pas évidentes à comprendre du premier coup, c'est normal...
Je n'attendais donc pas que tu comprennes les instructions, simplement je voulais te montrer le principe d'utilisation d'une structure :
Corps de programme principal
+ sous-programmes
+ sous-sous programmes
Appel du sous programme en lui passant les valeurs nécessaires à ses calculs et récupération des résultats
Si plusieurs sous-programmes utilisent le même type (et ordre de calculs), on "factorise" en mettant cette séquence répétée dans un même sous-sous-programme...
Ne me dis pas que tu inclus dans tes incompréhensions les deux mini scripts élémentaires :
i=10
while i//25 != 1:
i=i+2
print("i =",i)
print ("La condition n'était plus vérifiée, je suis sorti de la boucle !")
et
i=10
while i//25 != 1:
i=i+2
print("i =",i)
print ("La condition n'était plus vérifiée, je suis sorti de la boucle !")
Ils ont été commentés et je t'ai montré ce qu'on obtenait en faisant fonctionner ces deux mini scripts, au passage tu pouvais observer sur le 1er print() ce que changeait qu'il soit décalé ou non par rapport à la verticale du w de while : tu voyais donc l'indentation en action et tu devais mieux comprendre ce que je voulais dire avec mon questionnement pour savoir où ta boucle Tant Que W se terminait...
@+
Dernière modification par yoshi (07-10-2019 13:18:19)
Hors ligne
#260 07-10-2019 13:13:38
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Question 1 : deuxième interprétation (comme c'est écrit).
Question 2 : corrigé d'après ton exemple en Python. Que vient faire la ligne 74 ici ? Quand on sort de la boucle j on a la valeur de k. C'est tout.
Question 3 : je t'ai répondu. B disparaît en prenant la valeur de A. Un autre B apparaît avec next m ou next n si le résultat est différent de F.
Question 4 : oui, tu peux intervertir les deux lignes, mais c'est moins logique (pour moi) puisque le programme calcule les T < 63 avant d'aborder les T >= 63.
Sinon, je réponds à tes questions, comme tu vois.
Hors ligne
#261 07-10-2019 13:56:14
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Modif lignes 54 et 68. Tu voulais savoir ce que devient le B en cours si A devient B ? Il devient A évidemment.
Hors ligne
#262 07-10-2019 14:28:42
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
Et Ben tu as sacrément changé la définition d'un produit aligné...et tu changes le programme..car avant il s'arrêtait lorsque
cette condition P>s² est a , B >= S était remplie
maintenant tu le renvois 1er) sur sur 19 ou 20 c'est pareil, ie: si A - S = 0 alors print ...ou si A = D² + D + S sinon on continue...
mais Problème important dans le programme tu vas continuer à calculer lorsque :
52 Si P > S^2, si A >= S, si B >= S, aller à 54 (aligné à priori). Quelle différence avec les deux conditions ci-dessus ???
54 Si A > B, alors A = B
et idem pour la ligne 66...>68
§ Mais alors pourquoi ne pas calculer la ligne 55 avant la ligne 52 qui mettrait un terme, au lieu de créer des redondances....
puisqu'il faut calculer S à la ligne 52, d'où à ce moment la, si A - S = 0 et bien : stop print....! ou :
si ligne 59 si A = D² + D + S § idem pour les lignes 69 et 73,
d'où sinon : P>S², et A,et B > S alors aller à la ligne : si A > B alors A = B
c'est à dire, on connait A et P:
pour chaque produit P calculer $\sqrt{p}= R$ puis calculer $L = R² + r $ ; puis $S = P - L$ et : $\sqrt{A -S} = D$
a) si $A = S$ print stop , ou si $A = D^2 + D + S$ print stop.
b) sinon : P>S², et A,et B > S alors aller à la ligne : si A > B alors A = B....si bien entendu A est > B sinon on continue avec le A en court....??
et tu vas te retrouver ligne 60, qui te renvoie ligne 48 :
("Je pense que là, il va y avoir des Bugs....car avec le test : A0=73 et B =3692347 on se retrouve avec i=19 ,v=37 et T=37 à la ligne next i ")
24 Si A différent de F, aller à next i.
25 Si T est un nombre premier compris entre 3 et 47, aller à next i.
26 h = h + 2 (h = 1)
27 Si h > (T + 1) / 2, aller à next i.
28 Si T mod h = 0, alors A = A0 x h
29 Si T mod h différent de 0, aller à next h.
30 B = T / A
------------------------------------------------------
ligne 30 comment T peut être divisé par A qui est supérieur à T à la ligne 24,
et comme T est premier = 37 on reprend T=39 ,
en principe à cet instant ligne 26, h=3; donc ligne 28 : 39 / 3 = 0 alors :
A= A0*3; mais : A0 = 73 ??
donc 73*3=219
ligne 30 : B = 38 / 219 ???
--------------------------------------------------------------------------------------------------------------
voici le test de Yoshi avec les valeurs de v et T : on est à la ligne 18 : où cette condition P>s² est a , B >= S était remplie donc print résultat; ce qui ne serra plus le cas ok ?:
*** Début du programme ***
A0 = 73
B = 3692347
P = 269541331
V T
1 1
3 3
5 5
7 7
9 9
11 11
13 13
15 15
17 17
19 19
21 21
23 23
25 25
27 27
29 29
31 31
33 33
35 35
P = 9433946585
A = 2555
B = 3692347
-------------------------------------------------------------------------------------------------------------
next i ; i = 19, v = 37, T = 37 et T est un nombre premier.
-------------------------------------------------------------------------------------------------------------
@Yoshi :
que donne le programme si tu l'as modifié uniquement jusqu'à la ligne 31 ? avec la modification et le renvoi de la ligne 18 sur la ligne 20....Puis le renvoi de la ligne :
39 Si A différent de F, aller à next h.
Car à priori suite à cette modif de son post #200; et tes tests du post #201 , plus rien ne fonctionne suite à ce bug relatif à sa modification ou on tourne en rond...car SI l'égalité de la ligne A-S=0 et A = D²+D+S ne se rencontre pas .
Donc A différent de F fait que le programme tourne tourne....le furet.....
Dernière modification par LEG (08-10-2019 10:52:00)
Hors ligne
#263 08-10-2019 09:23:08
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Re LEG. Autant pour moi, ce n'est pas B = T/A mais B = P/A. Merci de ta remarque.
Hors ligne
#264 08-10-2019 09:34:44
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Re Yoshi. J'ai tout remis en écriture "basic instinct" (GOTO, NEXT, IF ...). C'est plus simple pour moi. J'ai délimité les différents blocs. Ligne 26, j'ai tenu compte des premiers (jusqu'à 47).
Input A
A0 = A
Input B
CALCUL DE T
1 N = A x B
2 P = N
3 V = 1
4 e = - 1
5 i = i + 1 (i = 0)
6 Si i > 1, V = V + 2
7 Si e = - 1, T = V
8 Si V = 51, e = e + 1 et V = 7
9 Si e > - 1 et si V = 7, T = 51 x 9^e
10 Si T > 49 x 9^e, T = 9 x (9^e x V)
CALCUL DE P (ET S)
11 Si i > 1, P = N x T
12 R = sqrt entière de P
13 L = R^2 + R
14 Si L > P, aller à next i.
15 Si L < P, S = P - L
TEST ALIGNEMENT A ET B SI P = N
16 Si P = N, alors si P > S^2, si A >=S, si B >= S, aller à 20.
17 Sinon, si A ou B < S, aller à next i.
18 Si P > N et si T < 63, aller à 26.
19 Si T >= 63, aller à 53.
20 A - S = C
21 Si C = 0 alors print P, A et B. STOP.
22 D = sqrt entière de C
23 F = D^2 + D + S
24 Si A = F alors print P, A et B. STOP.
25 Si A différent de F, aller à next i.
TEST ALIGNEMENT A ET B SI T EST PREMIER
26 Si T est un nombre premier >= 3 et <= 47, alors A = A0 x T.
27 Sinon, aller à 38.
28 B = P / A
29 Si P > S^2, si A >= S, si B >= S, aller à 31 (aligné à priori).
30 Sinon, si A ou B < S, aller à next i.
31 Si A > B, alors A = B et B = A
32 A - S = C
33 Si C = 0 alors print P, A et B. STOP.
34 D = sqrt entière de C
35 F = D^2 + D + S
36 Si A = F alors print P, A et B. STOP (aligné probable).
37 Si A différent de F, aller à next i.
TEST ALIGNEMENT A ET B SI T EST COMPOSE >=9 <=49
38 h = 1
39 h = h + 2
40 Si h > (T + 1) / 2, aller à next i.
41 Si T mod h = 0, alors A = A0 x h
42 Si T mod h différent de 0, aller à next h.
43 B = P / A
44 Si P > S^2, si A >= S, si B >= S, aller à 46 (aligné à priori).
45 Sinon, si A ou B < S, aller à next h.
46 Si A > B, alors A = B et B = A
47 A - S = C
48 Si C = 0 alors print P, A et B. STOP.
49 D = sqrt entière de C
50 F = D^2 + D + S
51 Si A = F alors print P, A et B. STOP (aligné probable).
52 Si A différent de F, aller à next h.
CALCUL DE K
53 Q = T / V
54 W = 3
55 j = 1
56 j = j + 1
57 Tant que W < Q alors W = W x 3
58 next j
59 k = j
TEST ALIGNEMENT A ET B SI T > 49 (avec A = 3^m x A0)
60 m = - 1
61 m = m + 1
62 Si m > k, aller à 74
63 A = 3^m x A0
64 B = P / A
65 Si P > S^2, si A >= S, si B >= S, aller à 67 (aligné à priori).
66 Sinon, si A ou B < S, aller à next m.
67 Si A > B, alors A = B et B = A
68 A - S = C
69 Si C = 0 alors print P, A et B. STOP.
70 D = sqrt entière de C
71 F = D^2 + D + S
72 Si A = F alors print P, A et B. STOP (aligné probable).
73 Si A différent de F, aller à next m.
TEST ALIGNEMENT A ET B SI T > 49 (avec A = 3^n x V x A0)
74 n = - 1
75 n = n + 1
76 Si n > k, aller à next i.
77 A = (3^n x V) x A0
78 B = P / A
79 Si P > S^2, si A >= S, si B >= S, aller à 81 (aligné à priori).
80 Sinon, si A ou B < S, aller à next n.
81 Si A > B, alors A = B et B = A
82 A - S = C
83 Si C = 0 alors print P, A et B. STOP.
84 D = sqrt entière de C
85 F = D^2 + D + S
86 Si A = F alors print P, A et B. STOP (aligné probable).
87 Si A différent de F, aller à next n.
Dernière modification par cosinuspax (08-10-2019 13:42:52)
Hors ligne
#265 08-10-2019 10:39:43
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
re : il y a un problème à éclaircir: avec la ligne 16:
16 Si P = N, alors si P > S^2, si A >=S, si B >= S, aller à 20. cette condition est impossible à partir de i=2 donc pour :
i=0 v=1 T=1 , A0=7 ; B=17 ;
1+=1 ==1 donc 7*17 = P = N = 119
1+=1 ==2 donc V=T= T+2 ==3 et A = 3*7 == 21 et 21*17 = 357 avant ta modif on faisait print A,B et P puis stop . ok ?
mais maintenant i = 2 donc P = N*t = 357 donc P ne peut être = N d'origine, soit : N0 = 119 ..ok?
et le calcul de S donne 15 à i==2 .. ok? avec A = 21 et B =17
donc ligne 17, A ou B < S = 15 : non ok ? on ne retourne pas à next i += 1 == 3 , que fait donc le programme à part tourner en rond si on ne déclare pas stop..??
est ce le bug que @Yoshi à rencontrer suite à ta petite vérif page 8 post #200 ?
mais supposions qu'on saute la ligne 17 on va à 20 :
ligne 20 : $A - S\not={0}$ donc : calcul D, calcul F : vérif : $A - D^2 - D - S = 0$ ok ; donc stop et print ; ok ?
d'où cette ligne 17 : si A ou B n'est pas inférieur à S sauter à la ligne 20 ...Non ? etc pour les cas suivants....lignes 30; 45 ...etc
Mais à quoi sert ces deux vérifications par rapport aux programme fait version 1 et 2 où : on avait P > S² avec A et B > S donc print A,B, P et stop ...????
Dernière modification par LEG (08-10-2019 10:48:02)
Hors ligne
#266 08-10-2019 10:58:17
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
Bonjour,
Je ne sais pas de quoi est fait ce changement : + 13 lignes numérotées !!!
J'ai passé l'après-midi d'hier à coder -non sans mal - moins de 40 lignes et s'il s'avérait que je doive tout flanquer à la poubelle et repartir de zéro, je pourrais assez mal le prendre et rendre mon tablier...
A l'avenir, lorsque tu as une solution quasiment définitive, je code et je teste et les correctif viendront après...
Sauf s'il s'agit d"un changement comme celui fait suite à la remarque de LEG sur B=P/A
Je vais voir l'étendue des changements...
@+
Hors ligne
#267 08-10-2019 11:46:30
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Tu peux tester avec la version précédente, ça marchera aussi à condition de tenir compte de B = P / T.
J'ai simplement rajouté un bloc "nombres premiers". Mais on peut s'en passer.
Dernière modification par cosinuspax (08-10-2019 11:48:12)
Hors ligne
#268 08-10-2019 12:10:55
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
LEG, ton cheminement est correct. Avec 7 x 17, on trouve un alignement avec T = 3 (si on retient les nombres premiers). On a A = 21, B = 17 tous deux supérieurs à S = 15. Produit aligné A PRIORI. Donc A = 17 et B = 21 (on inverse), et on teste 17 : 17 - 15 = 2 qui est bien égal à 1 x 1 + 1. Donc 17 x 21 est un produit aligné PROBABLE (même sûr car A et B sont tous deux dans la suite 15). La vérif ajoutée (F) nous permet de savoir si un produit est aligné PROBABLE ou pas. Il y a plein de produits alignés "à priori", mais beaucoup moins de produits alignés "probables". C'est pour ça que je tiens compte des diviseurs de T qui donnent lieu à une division plus fine des produits que le simple produit de A0 x T.
Hors ligne
#269 08-10-2019 13:51:49
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Si j'ai besoin d'alignements probables, c'est parce mon algo définitif (si ça marche, ce dont je doute fortement !) factorise uniquement ces produits-là, pas les autres.
Hors ligne
#270 08-10-2019 17:02:57
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
Bonjour,
Là, je ne comprends pas bien :
29 Si P > S^2, si A >= S, si B >= S, aller à 31 (aligné à priori).
30 Sinon, si A ou B < S, aller à next i.
31 Si A > B, alors A = B et B = A
32 A - S = C
33 Si C = 0 alors print P, A et B. STOP.
34 D = sqrt entière de C
35 F = D^2 + D + S
36 Si A = F alors print P, A et B. STOP (aligné probable).
37 Si A différent de F, aller à next i.
Ligne 31
A et B auront donc la même valeur : j'avais posé la question de savoir ce que devenait B parce que je me demandais, A prenant la valeur de B, quelle autre valeur allait prendre B...
Si A = B et si B ne change pas de valeur ensuite, il est évident que B =A...
Alors quel intérêt de travailler avec deux nombres A et B égaux ?
@+
Hors ligne
#271 08-10-2019 18:14:57
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
Ok cosinus mais tu n'as pas fais attention à ma remarque:
tu dis : Produit aligné A PRIORI. Donc A = 17 et B = 21 (on inverse), et on teste 17 : 17 - 15 = 2 qui est bien égal à 1 x 1 + 1. Donc 17 x 21 est un produit aligné PROBABLE
or il y a deux points qui posent problème :
1)
On est à la ligne 16 ok avec P = N*T ou (A*3) * 17 = 357 donc N= P=119 ne vérifie pas l'égalité de cette ligne 16 car S² = 225, d'où on ne va pas à la ligne 20 ok ?
2) donc on passe à la ligne 17 ok ? oui ou non...?
par conséquent : à cette ligne il y a aussi un bug : car à cet instant S = 15, et comme A et B ne sont pas inférieur à 15,
le programme est induit en erreur car, qu'est ce qu'il fait ???
il n'a pas d'instruction il faudrait : sinon si A et B > de S
alors on passe à la ligne 20 ok ?? qui devient : et si A > B on inverse, puis on test cette ligne 20 .
d'où :
3) 20 ("A inverse B") - S = C donc 17-15 = 2 donc ok....
21 : $C\not= 0$
on passe à 22 , 23 et on a F = 1+1+15 = 17
donc 24 : A inverse B = F ......> stop et print
En résumé :
Si ligne 20 $A - S\not= 0$
on passe ligne 21 (calcul ") si valeur entière : $\sqrt{A - S} = R $ et si $A - (R^2 +R +S)= 0$ alors stop et print.....
Sinon on retourne à netx i += 1 donc i = 3 ; pour V+= 2 == 5, T +=2 == 5 qui est premiers...! donc A = A0*T
; A0 = 7 , et 7*5 = 35 qui est le nouveau A ok ? oui ou non ?
mais à cet instant B =21 , donc on inverse encore oui ou non ....? Ou on calcul le P :
A = 21 et B =35 On calcule P ou Pas si oui 35*21 = 735 ?
pour calculer la ligne 28 : B = P /A le quel de A ? si c'est le A0 alors 735/7= 105 =B si c'est A = 35 alors 735/35 = 21 .....??? gros grosse interrogation ....?
d'où P = 21*35 = 735 , on est à la ligne
Don il faut éclaircir ces points avant de toucher au programme et ensuite faire un test avec cette partie programmée....jusqu'à la ligne 29 ou :
29 Si P > S^2, si A >= S, si B >= S, aller à 31 (aligné à priori). Et on parle bien dans ce cas de figure de P = 735 ou de P = 35*105 = 3675 ???
A toi de reprendre point par point ces instrcutions en gardant ces exemples afin qu'il n'y ai pas de confusion....
Hors ligne
#272 08-10-2019 18:25:48
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
re @Yoshi :
la ligne 31, pour moi il veut dire A prend la valeur de B et B prend la valeur de A donc on inverse ....c'est ce qu'il indique au post au dessus ligne 17,18....etc
mais le problème se situe entre les lignes 20 et 29 ...c'est pour cela qu'il faudrait qu'il éclaircisse ses point ..sauf si de ton côté tu as compris mais remarque du post ci dessus : #271
Dernière modification par LEG (08-10-2019 18:26:35)
Hors ligne
#273 08-10-2019 19:53:01
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Alignement de produits
Salut,
Ligne 31. C'est que j'avais cru comprendre quand il m'avait répondu là-dessus...
Mais rédigée comme l'est sa ligne 31, ne peut marcher.
En Python, il suffit d'écrire A,B=B,A...
Dans d'autres langages, il existe une instruction du type : swap A,B : échange A et B.
Quand ce n'est pas prévu, il faut passer par un récepteur provisoire : Z=B, B=A et enfin A =Z...
Au lieu d'écrire A = B et B = A, il vaut mieux écrire échanger A et B.
Concernant les lignes 16 et 17, il faut les comprendre comme ça :
Si P = N
| SI P>=S²
| | Si A>=S et B >=S
| | | aller à 20
| | SINON si A<S ou B < S
| | | Next i
| | FIN SI
| FIN SI
FIN SI
Je n'avance pas vite dans mon codage parce que les sauts intempestifs sont immondes à transcrire en Python et que je fais du travail dég... et que je n'aime pas ça !
J'ai les sous-programmes racine_entière et calculs de base (que j'ai renommé en initialisation1).
J'ai ajouté les lignes 20 à 25 dans le sous programme initialisation2 qui sera utilisable 4 fois :
def initialisation2(A,B,S,P):
C=A-S
arret=0
if C==0:
affiche_conclusion(P,A,B)
return 1
else:
R=racine_entiere(C)
L=R**2+R+S
if A==L:
affiche_conclusion(P,A,B)
return 1
else:
return 0
def conclusion(P,A,B):
print("** Alignement probable **")
print ("P =",P)
print(" A =",A)
print(" B =",B)
print()
return
Moyennant quoi, je démarre comme ça :
#!/usr/bin/env python
# coding: utf-8 -*-
from math import sqrt
from time import time
def racine_entiere(n):
""" Sur la base de la méthode de Héron"""
if n<10**10: # Si n a moins de 11 chiffess
return int(sqrt(n)) # sinon stockage longueur n
ln_str=len(str(n))
ln_utile=(ln_str-10)//2 # moitié de la longueur au delà de 10 chiffres
n_coupe = int(sqrt(n//10**(ln_str-10)))
rac=int(sqrt(n_coupe))*10**ln_utile
r0=1
while not r0==rac:
r0=rac
rac=(rac**2+n)//(2*rac)
return rac
def initialisation1(V,e,P,T,N):
V+=2
if e == - 1:
T = V
if V == 51:
e+=1
V = 7
if e>-1 and V==7:
T=51*9**e
if T>49*9**e:
T = 9**(e+1)*V
P=N*T
R = racine_entiere(P)
L=R**2+R
return e,P,V,L,R,T
def initialisation2(A,B,S,P):
C=A-S
arret=0
if C==0:
affiche_conclusion(P,A,B)
return 1
else:
R=racine_entiere(C)
L=R**2+R+S
if A==L:
affiche_conclusion(P,A,B)
return 1
else:
return 0
def conclusion(P,A,B):
print("** Alignement probable **")
print ("P =",P)
print(" A =",A)
print(" B =",B)
print()
return
def BTA(A,S,P):
B=P//A
if P>S**2:
if A>=S and B<=S:
if A>B:
A=B
return A,B,0
else:
return A,B,1
def titre():
print("\n")
print(" *************************************************")
print(" * Alignements progressif de produits *")
print(" * Idée : cosinuspax *")
print(" * v.3 *")
print(" *************************************************","\n\n")
debut=time()
titre()
A=103
B=397
print(" *** Début du programme ***")
A0=A
N=A*B
e,V,T,h=-1,-1,0,0
fin_h,fin_m,fin_n,nh,h,n,m,stop==0,0,0,0,0,1,-1,-1,0
print ("A0 =",A0)
Primes=[3,5,7,11,13,17,19,23,29,31,37,41,43,47]
print ("B =",B)
print ("P =",N,"\n")
arret,P=0,N
while not arret:
e,P,V,L,R,T=initialisation1(V,e,P,T,N)
fin_h,fin_m,fin_n,nh,h,n,m,stop==0,0,0,0,0,1,-1,-1,0
while not stop:
if L>P:
break
elif L<P :
S=P-L
if P==N:
if P>S**2:
if A>=S and B>=S:
arret=initialisation2(A,B,S,P)
break
elif A<S or B<S:
break
else:
if not T<63:
arret=initialisation2(A,B,S,P)
break
else:
fin_h=1
else:
if T in Primes:
A=A0*T
B=P//A
if P>S**2:
if A>=S and B>=S:
arret=initialisation2(A,B,S,P)
break
elif A<S or B<S:
break
SGDG, et sujet à modifs à tout moment, hein, parce que impossible à tester comme ça...
J'ai prévu une boucle while pour ses next h, next m et next n gérés par des conditions portant sur fin_h, fin_n, fin_m (initialisés à 0)
while not fin_h, while not fin_m et while not fin_n
Et si je suis obligé de sortir de la boucle next h, pour faire un next i, je dois empêcher le déroulé du programme de rentrer dans les boucles suivantes en passant par passer fin_m et fin_n à 1 avant de sortir...
En ce qui concerne la boucle d'origine qi s'appelait simplement while True : je l"ai repensée while not stop (stop initialisé à 0) celle-la, j'en sors avec stop=1 suivi de break.
On ne peut pas sortir de la boucle depuis un sous-programme qu'elle a appelé... Il faut sortir du sous-programme (donc revenir dans la boucle) et breaker dès la sortie...
Je pense pouvoir poursuivre demain.
Ce qui va me gêner : le h est incrémenté de deux façons h = h+1 et h = h=h+2.
De plus, dans cette boucle il va falloir que je fasse un retour en arrière de plusieurs lignes et que je vois pas trop aujourd'hui comment implémenter ça...
A l'intérieur d'une def, je peux choisir les noms de variables que je veux différents de ceux du programme principal, pourvu que je récupère à l'arrivée dans la les variables passées en paramètres dans le bon ordre, et que je récupère les résultats (obtenus dans la def) retournés par la def, dans le programme principal dans le bon ordre...
Ce n'est pas une obligation d'utiliser les mêmes noms : je le faisais au cas où il aurait eu l'intention de déchiffrer le code...
@+
Hors ligne
#274 08-10-2019 21:55:47
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Alignement de produits
Ok Yoshi , pour l'explication ligne 16 et 17 , je ne le comprenais pas comme ça ...
je pense que tu as inverser le signe > en < dans le bloc ci dessous à la ligne: if A>=S and B>=s
def BTA(A,S,P):
B=P//A
if P>S**2:
if A>=S and B<=S:
if A>B:
A=B
concernant ces deux lignes qui te posent problème ensuite :
38 h = 1
39 h = h + 2
tu es sûr que cela ne veut pas dire 38 h =1 initialisé à 1, puis h += 2 il incrémente de 2 lorsque i augmente de 1 ; car ce h, pour moi il remplace V ....non ???
ensuite il vaut peut être mieux tester, une fois ce bloc fini à la ligne 52 ; avant d'aller plus loin......et voir ce que cela donne....
j'ai une erreur de syntax dans ce bloc la troisième condition :
else:
if not T<63:
arret=initialisation2(A,B,S,P)
break
else:
fin_h=1
else: <....ici erreur :invalid syntax
if T in Primes:
A=A0*T
B=P//A
if P>S**2:
if A>=S and B>=S:
j'évite de te souhaiter bon courage mais le cœur y est....
@+
Dernière modification par LEG (08-10-2019 22:47:59)
Hors ligne
#275 08-10-2019 22:01:04
- cosinuspax
- Membre
- Inscription : 23-02-2019
- Messages : 252
Re : Alignement de produits
Re, Yoshi. Il faut inverser les valeurs de A et de B. Voir l'exemple de LEG : 21 (A) x 17 (B) avec S = 15. Si tu inverses A et B tu as bien A = 17 et B = 21 ? Pourquoi auraient-ils la même valeur ?
Hors ligne







