Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#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 = 12
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 :

i = 26
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 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
    (...)
    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

Yoshi a écrit :

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

Pied de page des forums