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).

#101 Re : Café mathématique » Une "Freecell" ingagnable ? » 11-09-2010 13:01:26

Salut,

Pour vous encourager à vous passer de votre calculette et passer à Python, voici le (mini) programme qui permet d'arriver au résultat.
Sans doute celui de Yoshi sera encore plus mini...  ;-)

def d():
    j=1
    for i in xrange(52,1,-1):
        j=i*j
    print j

mini A+-*/


P.S.   As-tu constaté, comme moi, cher Yoshi, que le temps d'exécution d'un même programme peut notablement varier? Pour quelle raison? Serait-ce dû au travail de l'ordinateur en parallèle (internet ou autre par ex.)?

#102 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 09-09-2010 17:42:13

Salut,

Karlun a écrit :

Je transpose en programme la méthode de résolution à la main de l'extraction de racine 5 (augmentée d'une unité) et simultanément  la division par 2.

et encore

Un peu présomptueux sans doute....le simultanément était mon idée mais il en est tout autre dans le prog. transmis. J'ai opéré la division après avoir calculé la racine; sans doute, tenir compte de cette remarque fera gagner du temps.

Et bien non!

L'ancienne version pour 300 chiffres: 0.25 s.
                                   3000          : 117.638
Cette nouvelle version, 300 chiffres: 0.28 s.
                                  3000           : 129.635

Voici la nouvelle version un peu nettoyée et améliorée.

# -*- coding: cp1252 -*-
from math import*
from time import time

    #=============================================
    #  extraction à la main de phi (1.618033....) à partir de ***((Racine 5) + 1)/2***
    #=============================================
def extract_phi(w=10):
    "extraction à la main de phi (x-1=nbre de chiffre)"
   
    #======================================
 # 1)extraction chiffre par chiffre, à la main de racine de 5 et division par 2 du chiffre-résultat
 #   (le premier est majoré de une unité).
    #======================================
   
    def racinePlus(v,r,t,q,rn):
        "place dans les listes ra,re,tot les résultats calculés"
        ra.append(v)
        re.append(r)
        tot.append(t)
        quot.append(q)
        resteDiv.append(rn)
        return ra,quot,resteDiv

    def racineMoins(m):
        "enlève des listes le dernier élément"
        del ra[m]
        del re[m]
        del tot[m]
        del quot[m]
        del resteDiv[m]
        return ra,quot,resteDiv

    def travRacine(ra,re,tot,z,t):
        ra[z-2]=ra[z-2]-1
        re[z-2]=re[z-2]+40
        resteDiv[z-2]=resteDiv[z-2]-1
        quot[z-2]=resteDiv[z-2]/2
        racineMoins(z-1)
        return ra,re,tot,z,quot,rn
   
    tp_d=time()
    #première étape: amorce de l'extraction de racine 5 et de la division par 2
    v=int(sqrt(5.))+1
    r,q,rn=10,1,3
    t,p,x=0,0,w
    ra,re,tot,quot,resteDiv=[],[],[],[],[]
    racinePlus(v,r,t,q,rn)
    z=len(ra)
    #Et c'est parti pour des tours.

    while(len (ra)<w):
         #calculs intérieurs => caculer t à partir des listes existantes
       
        p+=1
        a,b,t,=0,0,0,
        c=(z+1)/2
        if(((z)%2)):                # =>z+1 est paire
            while(a<(c-1)):
                t=t+2*(ra[c-1-a]*ra[c+b])
                a=a+1
                b=b+1
        else:                       #=> z+1 est impaire
            while(a<(c-1)):
                t=t+2*(ra[c-1-a]*ra[c+1+b])
                a=a+1
                b=b+1
            t=t+ra[c]**2
        #comparaison t doit être < que le reste: si non on dégraisse
       
        for i in xrange(ra[z-1],0,-1):
            if(t>re[z-1]):
                ra[z-1]=ra[z-1]-1
                re[z-1]=re[z-1]+40
                tot[z-1]= tot[z-1]
                t=t-4
                resteDiv[z-1]=resteDiv[z-1]-1
                quot[z-1]=resteDiv[z-1]/2
               
                #dégraissage accompli
                     
        if(ra[z-1]<=0):
            if(t>=re[z-1]):
                i,j=0,1
                while(i<j):
                    t=tot[z-1]-4                   #pour conserver t après travRacine
                    travRacine(ra,re,tot,z,t)
                    z=len(ra)
                    if(ra[z-1]==0):                 #cas où 1-1=0
                        if(t>re[z-1]):
                            j=j+1
                        else:
                            j=j
                    else:
                        if(ra[z-1]==-1):            #cas où 0-1=-1
                            j=j+1
                        else:
                            j=j
                    i+=1
       
        #ajout de la nouvelle racine (ra,re,tot)
        #ajout du nouveau quotient et de son reste (quot,resteDiv)
                   
        v=(re[z-1]-t)/4
        if(v>9):
            v=9
        r=(re[z-1]-(4*v+t))*10
        rn=(resteDiv[z-1]-quot[z-1]*2)*10+v
        q=rn/2
        racinePlus(v,r,t,q,rn)
        z=len(ra)
    tp_a= time()
    print tp_a-tp_d,'s'
    #print ra
    print quot  #qui est égal à phi
   
 
#=========================
    #commandes
extract_phi(300)
#=========================

Cette version jette la base du calcul de la racine carrée de phi, chiffre après chiffre, de manière illimitée.
(((1+extraction de racine de 5) division par deux) et extraction racine carrée).

Cet objectif pourrait-il être réalisé par une autre méthode?

A+-*/

#103 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 06-09-2010 19:19:53

Salut,

Je regarde les résultats de ma version (dernière et rameuse) et  ça me semble coller; il y a la liste et il y a le classement en dessous.

Tes remarques m'incite à reprendre et vérifier.

"classer la fréquence de chacune des décimales dans un ordre décroissant à partir de leur position dans la chaîne."

avait pour but de percevoir, en un regard, les changements de classement des décimales restées ordonnées (de 0 à 9)


A+-*/

#104 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Rattrapage de l'oral d'arithmétique de Paris 18 » 05-09-2010 17:42:22

'lut,

(Je me rattrape avant de tomber peut-être.)

C'est possible que personne ne gagne rien...si d=6.
Jean et Paul jouent la différence positive pour obtenir 6 et aucun des deux ne perd.
6 est centre de 11:   5 de part et d'autre.

A+-*/

#105 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Oral d'arithmétique à l'UFR de Maths de Paris 18 » 05-09-2010 16:48:14

Re,

Oups! mon verre de vingt est vide; à terre?  Non!;  ce doit être que je l'ai bu...
Ouf y en a encore.

Balancier balance.

Le raisonnement précédent est maintenu.
Les 5,10,15,20,25 sont à éliminer par Y et les 4 %5 (4 modulo5) et les 3%5

X, bon gouteur, recrache  le 20:

X        Y

20        4
1        3
2        9
6        8
7        14
11        13
12        19
16        18
17        24
21        23
22

restent: 26 , 27, 5,10,15,25
Et quoi que joue Y, X gagne.
Y doit donc éliminer 3 de  ces 4 gênant « 0%5 » avant le 10° tirage.
Ce qui amène à un reste du type:
26,27,23,24,18,25 et c'est à Y à tirer. X s'en tire encore.

« A chaque nombre enlevé par X, Y enlève le nombre tel que la somme des deux = 0 modulo 5. »

X amène Y à tourner (en spirale) sur les étoiles et comme c'est X qui commence c'est Y qui rompt la spirale et relance l'initiative: soit 0%5 (c'est un conseil) soit l'autre étoile et X finit encore par l'emporter.

Si Y choisi le style patchwork, X se contente d'entretenir l'équilibre des paires  0%5.

Enfin c'est ce que je crois... mais je peux me tromper.

A vos remarques +-*/

#106 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Oral d'arithmétique à l'UFR de Maths de Paris 18 » 05-09-2010 13:29:58

R'jour,

Tel le balancier, (merci à l'harmonisateur),
je bats (me) et recommence.


Mise en étoile: On tourne (par couche ou pas) et ça fait des multiples de 5.

              21
             11
              1

24  14  4        9  19

              6
             16
             26



              22
              12
               2

23  13  3        8  18

              7
             17
             27

et encore:

5  10  15  25 


Stratégie de Y: éliminer les entiers des deux premièrs axes horizontaux (qui sont les plus courts), (24,14,4,9,19,23,13,3,8,18) afin d'isoler les axes verticaux qui sommés ne sont pas multiple de 5.
Pour Y 10 coups suffisent et encore 3 coups pour éliminer 3 des 5,10,15,25 restant.
En 13 coups il s'en sort haut la main.
Mais il n'a que 12 coups !!! Y est perdu.
Au bout du 12° coup c'est à X à jouer:

Il peut rester: (ce ne sont que des exemples mais prélevés au départ des places de départ)

15    25    12    => X prélève 12

15    8    17    => X prélève 15

14    13    27    => X prélève 14

Stratégie de X: surtout ne pas toucher aux axes horizontaux du schéma ci-dessus et attendre que Y joue.
X joue ce qu'il veut sur les axes verticaux et sur la zone que vient de jouer Y (sauf le premier coup évidemment).

A+-*/

#107 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » Oral d'arithmétique à l'UFR de Maths de Paris 18 » 05-09-2010 09:01:39

Bonjour,


« X et Y jouent l'un contre l'autre. X joue en premier. Chacun enlève à tour de rôle un nombre jusqu'au moment où il n'en reste plus que deux. »
Cette nuit, j'y ai un peu pensé; j'essaye mais ça paraît un peu trop simple.
(Vivement en apprendre.)

Soient les nombres entiers de 1 à 27.
En tout, X fera 13 tirages et Y 12 tirages.
C'est  X qui retire l'antépénultième entier en laissant sur la table deux derniers
dont leur somme est un multiple de 5 s'il veut gagner.

Il y a au moins (déjà) 38 façons de sommer deux entiers pour obtenir un multiple de 5 .

  2---3              1---4                5---10---15---20---25
     X                   X           
  7---8              6---9
     X                   X           
12---13           11---9
     X                  X           
17---18           16---19
    X                  X           
22---23          21---24
    X                  X           
27                  26

La stratégie de X est de conserver sur la table des couples d'entiers dont la somme est multiple de 5; il doit se méfier des entiers dont la valeur est déjà un multiple de 5 (5,10,15,20,25) car laissé solitaire, additionné à n'importe quel autre entier non multiple de 5 donne un non-multiple de 5.

La stratégie de Y est d'enlever un max de couples  dont la somme est multiple de 5; mais en 12 prélèvements ce ne sera que peine perdue j'en ai bien peur.
Le candidat malheureux est Y à moins que X joue comme un manche.

A+-*/

#108 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 04-09-2010 21:33:19

'Soir,

Un coin bouché!    ....un  !

Merci Maître.
j'm'en vais l' méditer.

A+-*/

#109 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 04-09-2010 19:09:51

Bon-jour-soir
...selon,

Programmation:

Encore dans l'idée d'user Python j'essaye des trucs.

A partir d'une de mes versions (pas rapides) « calcul de Phi » je me suis lancé dans l'analyse des décimales de racine de 5.

J'ai déjà indiqué que la moyenne était inférieure à 0,5.
La parité, ou non, est aussi intéressante. (Plus paire qu'impaire)

La répartition des décimales me semblait à poursuivre permettant, ainsi, d'optimiser le choix des dixièmes pour le calcul de la racine de cinq. (0,3 n'a pas fort la quotte)
Voici les résultats:

[ la série des décimales]
Nbre de décimales:   [Classement (du 1er, au dernier) des rangs]
si [5,.... => le plus grands = 6/10 (6° position)

[95, 89, 111, 98, 110, 118, 95, 98, 90, 95]
1000     [5, 2, 4, 3, 7, 0, 6, 9, 8, 1]

[195, 203, 207, 184, 215, 203, 187, 201, 209, 195]
2000     [4, 8, 2, 1, 5, 7, 0, 9, 6, 3]

[282, 308, 330, 262, 317, 311, 305, 286, 301, 297]
3000     [2, 4, 5, 1, 6, 8, 9, 7, 0, 3]

[383, 401, 429, 352, 423, 419, 417, 389, 399, 387]
4000     [2, 4, 5, 6, 1, 8, 7, 9, 0, 3]

[493, 511, 513, 464, 526, 497, 523, 494, 495, 483]
5000     [4, 6, 2, 1, 5, 8, 7, 0, 9, 3]

[594, 616, 618, 548, 628, 599, 624, 594, 606, 572]
6000     [4, 6, 2, 1, 8, 5, 0, 7, 9, 3]

[683, 711, 725, 653, 732, 698, 737, 685, 713, 662]
7000     [6, 4, 2, 8, 1, 5, 7, 0, 9, 3]

[807, 807, 825, 740, 835, 782, 833, 778, 819, 773]
8000     [4, 6, 2, 8, 0, 1, 5, 7, 9, 3]

[896, 912, 929, 841, 931, 888, 937, 886, 911, 868]
9000     [6, 4, 2, 1, 8, 0, 5, 7, 9, 3]

[997, 1011, 1025, 955, 1020, 999, 1039, 986, 1010, 957]
10000     [6, 2, 4, 1, 8, 5, 0, 7, 9, 3]

[1109, 1110, 1122, 1054, 1108, 1093, 1147, 1090, 1102, 1064]
11000     [6, 2, 1, 0, 4, 8, 5, 7, 9, 3]

[1213, 1213, 1221, 1171, 1203, 1199, 1240, 1178, 1177, 1184]
12000     [6, 2, 0, 1, 4, 5, 9, 7, 8, 3]

[1313, 1316, 1316, 1282, 1312, 1278, 1346, 1266, 1283, 1287]
13000     [6, 1, 2, 0, 4, 9, 8, 3, 5, 7]

[1430, 1408, 1406, 1370, 1408, 1386, 1427, 1359, 1395, 1410]
14000     [0, 6, 9, 1, 4, 2, 8, 5, 3, 7]

Et voila que ça change beaucoup... bigre! Que d'illusions!
Merci l'informatique.

14000 décimales au regard de l'infini... broutilles.

Y aurait-il déjà eu des études de ce genre poussées plus avant ?

Voici le programme que je souhaite voir dûment corrigé ( c'est aussi le but de ce post; j'ai tant à apprendre...)

L'idée était de classer la fréquence de chacune des décimales dans un ordre décroissant à partir de leur position dans la chaîne.


def v2 (ndc=15000):
    #tp_d=time()
    for e in xrange(1000,ndc,1000):
        a0,a1,a2,a3,a4,a5,a6,a7,a8,a9=0,0,0,0,0,0,0,0,0,0
        p,i,n,ra,L,F=0,0,1,29,[2],[]
        while n<e:
            while ((ra**2)>5*10**(2*n)):
                ra=ra-1
            re=ra%10
            L.append(int(re))
            #if re%2==0:
                #p+=1
            #else:
                #i+=1
            a0=a0+(re==0)
            a1=a1+(re==1)
            a2=a2+(re==2)
            a3=a3+(re==3)
            a4=a4+(re==4)
            a5=a5+(re==5)
            a6=a6+(re==6)
            a7=a7+(re==7)
            a8=a8+(re==8)
            a9=a9+(re==9)
            ra=(ra*10)+9   
            n+=1
        ra=(ra+1*10**n)/2
        F=[]
        F.append(a0)
        F.append(a1)
        F.append(a2)
        F.append(a3)
        F.append(a4)
        F.append(a5)
        F.append(a6)
        F.append(a7)
        F.append(a8)
        F.append(a9)
        #tp_a=time()
        Ay,C=0,[]
        print F
        for y in xrange(10):
            Ay=F.index(max(F))
            C.append(Ay)
            F[Ay]=0
        print e,"   ",C
    #w,x=float(sum(L)),len(L)
    #print "moyenne= ",w/x,"   paires=",p,"  impaires=",i
    #print tp_a-tp_d,'s'


Qui se lance comme une def avec les import d'usages


A, mes gesticulations et +-*/       :-)

#110 Re : Enigmes, casse-têtes, curiosités et autres bizarreries » le caméléon monochrome » 02-09-2010 16:15:58

Bonjour,

une approche mécanique?

Il s'agit de trouver la manière la plus rapide de se faire rencontrer  les caméléons afin de ne plus avoir qu'une couleur.
(Deux caméléons de couleur différente se rencontrent => il y a deux caméléons de la même couleur)  Il faut donc trouver les bonnes rencontres afin d'obtenir un même nombre de caméléon de couleur différente; ceux-ci se croisent et bingo!
Il n'y a qu'une seule façon:

R   B   V           
________   
7  10  17       Données de départ
9    9  16       (B et V) -1 => R+2 => R=B
0    0  34        9R+9B= 18V+16V= 34V

R   B   V           
________   
7  10  17       Données de départ
6  12  16       (R et V) -1 => B+2 => B!=V
5  14  15        idem  B+2 et V-1 ne seront jamais égaux
4  16   14

R   B   V           
________   
7  10  17       Données de départ
6   9   19       (R et B) -1 => V+2 =>ça n'a pas de sens


A+-*/

#111 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 28-08-2010 14:26:04

'lut,

Je pensais:

Et si pour gagner du temps on choisissait le bon côté d'attaque?
Aussi j'ai calculé la moyenne des 5000 iers chiffres de phi:  4.44   .
Donc, je pense qu'on arrive à boucler un cycle plus rapidement en descendant de 5 plutôt qu'en montant...
Peut-être ne seront-ce que des fifrelins de secondes...

A+-*/

#112 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 28-08-2010 12:37:40

+-*/  ...  Bonjour,

J'ai cherché un peu... dans la simplicité.
Je me suis heurté au type" float" qui va pas loin (il m'a fallu un peu de temps pour m'en apercevoir vu qu'aucun message d'erreur ne vient indiquer qu'il est bloqué comme infini).

Comme toi, je me suis tourné vers les entiers.

Ça tourne mais c'est pas rapide: 5000 décimales en 33,08 s.

Au moins il reste limpide et apte à servir de programme "martyre" des fois qu'on voudrait, touche par touche, en accélérer le fonctionnement.


def v2 (nbd=5000):
    tp_d=time()
    n,ra=1,20
    while n<nbd:
        while ((ra**2)<5*10**(2*n)):
            ra=ra+1
        ra=(ra-1)*10    
        n+=1
    ra=(ra+1*10**n)/2
    tp_a=time()
    print ra
    print tp_a-tp_d,'s'

Programme à lancer comme une def (  def v2()  ) après les "from import" d'usages.

Peut-on penser "pas de nouvelle, bonne nouvelle", Yoshi, pour ce qui est de ton "huit" récalcitrant?



A+-*/

#113 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 25-08-2010 21:54:30

'soir,

Voici:

>>>
[10, 20, 40, 40, 70, 100, 120, 200, 220, 260, 300, 380, 430, 540, 550, 600, 690, 760, 710, 20]
[1, 6, 1, 8, 0, 3, 3, 9, 8, 8, 7, 4, 9, 8, 9, 4, 8, 4, 9]
nbre de cycles internes:    33
0.0 s
>>>

Mais c'est du vite fait, tirés du programme; j'espère qu'ils sont  bons (je crois qu'ils correspondent à ce que j'ai en mémoire.)

Mon expérience en matière de rebours m'a appris qu'il fallait parfois attendre plusieurs cycles avant d'obtenir la correction (à tâtons il est vrai mais logique) d'où le nombre de cycles intérieurs; un 9 au départ, pouvait devenir un zéro et encore réclamer un rebours à la dizaine inférieure (voire à plusieurs dizaines parfois).
Ton 8, après un cycle intérieur ou deux ou trois pourrais être ramené au 7 logiquement attendu...

Suite à ton post précédent j'ai été vérifier le résultat que donne mon programme avec celui de ta version 3; tu pourras constater que les derniers 3 ou 4 termes sont différents. Normal. Il faudra attendre encore une trentaine (?) d'opérations internes afin de corriger ces éphémères suspensions de chiffres.

Bon repos ou bon boulot (c'est selon).

A+-*/

PS: Les restes sont bien les bons; j'ai vérifier sur mon calepin de montagne...

#114 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 24-08-2010 19:45:22

R'lut,

2  2  3  6    et puis zéro...

Ah ça j'ai que trop connu...

Sacrés zéros.

Ta version 3?  un bijou.

A moi d'en pondre un autre?
Faut que j'y pense.

A+-*/

#115 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 24-08-2010 19:08:22

Salut,

Ah oui, ça c'est lent de chez lent... ;-)

J'ai pompé tes codes "temps " et les ai insérés dans mon programme du début ...

Pour    498 décimales :    0.904 s.
Pour   1000 décimales :   5.648 s.
Pour   2000 décimales : 45.56 s.         avec  102338 cycles internes.

Les raccourcis (logiques) que tu as fait, j'en ai également abusés.
Par ex.: si x>9 alors 9 et puis aussi directement ajouter au reste 40 à chaque débordement et -4 au calcul interne.

N'as tu pas rencontré de difficultés avec les rebours à la dizaine inférieure?

Courage.  ;-)

A+-*/

#116 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 23-08-2010 20:31:47

R'venu du boulot, 'soir,

Bien vu Yoshi... encore une erreur.
fallait bien entendu remettre 3 dans le calcul du reste "t-1' et j'ai oublier d'écrire   "+(2*2)"  mais le résultat est bon...     Mea culpa.  (histoire de cheval et d'écurie).

Pour ce qui est de la méthode:

ayant visualisé la méthode (ces tracés de flèches de droite à gauche), j'ai de suite imaginé son rebours sans plus.
Le calcul, suivant cette méthode, d'un carré symétrisait aussi les données (horizontalement)...
Delà, ça découlait de source...   (non?)

Notre amis, M. CLAES à évidemment abordé le carré d'un nombre et sa racine aussi suivant sa méthode... mais je n'en sais pas plus sur elle que sur d'autres méthodes (comme celle que tu nous a exposé).

Là haut, sur la montagne, j'ai essayer sur mon calepin quelque calcul de racine et ...

Encore une fois, dans le thème proposé, il s'agissait pour moi de me familiariser avec les "conditionnelles" en programmation (une fois assurée "ma "" méthode").

Yoshi a écrit :

3                    | 1
- 1 (1*1)           |----------------
------------   
  2 0                                  Et là si,  j'ai bien compris tu fais   1  x   
                                                                                          \ /
                                                                                          / \
                                                                                         1  x         

Mon problème :  2x = 20  d'où x = 10, ça ne devrait pas arriver...
Qu'est-ce que j'ai raté ?

Bof!, me connaissant un peu, tu ne t'étonneras pas que j'accepte de poursuivre avec 10.

alors:

   3                    | 1  "10"
- 1 (1*1)           |----------------
------------   
  2 0                                  Et là si,  j'ai bien compris tu fais       1  x   
  2 0                                                                                        \ /
  ----------                                                                                / \
     0 0                                                                                    1  x         

                                         Alors   1  "10"  xx

                                                    1  "10"  xx
                    et donc   2*x+10*10<0     2x< -100     !!!négatif!!!    alors   rebours. reste=
   3                    | 1  9
- 1 (1*1)           |----------------
------------   
  2 0                                  Et là si,  j'ai bien compris tu fais       1  x   
  1 8                                                                                        \ /
  ----------                                                                                / \
     2 0                                                                                    1  x         
                                         Alors   1  9  xx

                                                    1  9  xx
                    et donc   2*x+9*9<20     2x< -61    !!!négatif!!!    alors   rebours. reste=



  3                    | 1  8
- 1 (1*1)           |----------------
------------   
  2 0                                  Et là si,  j'ai bien compris tu fais       1  x   
  1 6                                                                                        \ /
  ----------                                                                                / \
     4 0                                                                                   1  x         
                                         Alors   1  8  x

                                                    1  8  x
                    et donc   2*x+8*8<40     2x< --24    !!!négatif!!!    alors   rebours. reste=

  3                    | 1  7
- 1 (1*1)           |----------------
------------   
  2 0                                  Et là si,  j'ai bien compris tu fais       1  x   
  1 4                                                                                        \ /
  ----------                                                                                / \
     6 0     (table de 20)                                                            1  x         
                                         Alors   1  7  xx

                                                    1  7  xx
                    et donc   2*x+7*7<60     2x< 11 alors 11/2=5,......reste= 59

  3                    | 1  7  5
- 1 (1*1)           |----------------
------------   
  2 0                                      1  7  5  x   
  1 4                                                                                     
----------                                1  7  5  x
     6 0
     5 9
  ---------                                                                                       
        10      mais 2*35 (calculs internes) trop grand rapport au reste =>  etc. etc.

La méthode que j'ai appliquée consiste à diviser en 2 la longueur de la chaine et selon qu'elle est paire ou pas, il faudra pas ou il faudra ajouter le carré du central à la somme du double produit des termes (pris 2à2) depuis le centre jusqu'aux 2 (bords-1)... gesticulation j'en conviens.

Je suis lent et je vois ton dernier post à l'instant d'envoyer le mien.
Je te l'envoie sec il illustre quelques questions que tu poses, je pense.


A+-*/

PS. j'ai corrigé l'exposé de la méthode. ouf!

#117 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 22-08-2010 17:45:04

'soir,

Yoshi a écrit :

Ah bin, voilà une méthode que je connaissais pas...
Tu peux l'expliquer en détail ? Ça correspond à ça : http://serge.bertorello.free.fr/math/racine.html ?

Cette méthode est déduite d'une manière originale de multiplier  tirée d'un petit fascicule dû à notre ami M. H.-E. CLAES dont j'ai déjà abordé et présenté une autre trouvaille.

J'ajoute donc cette méthode de multiplication à ce sujet (http://www.bibmath.net/forums/viewtopic.php?id=3733).

Voici une manière de calculer une racine carrée en s'appuyant sur cette méthode.



extractcorrige.png





A+-*/

#118 Re : Café mathématique » Astuce 1: multiplications faciles sans report (ou presque) » 22-08-2010 16:01:41

Bonjour,

Afin d'expliquer une méthode pas trop rependue d'extraire une racine carrée ou autre, il me faut vous faire encore partager une autre trouvaille de notre ami M. Henri-E. CLAES.

Il a repéré une propriété mathématique d'une grande harmonie:
Celle-ci nous permet,sans avoir un don particulier, de faire une multiplication en écrivant le produit directement en dessous des nombres que vous vous proposez de multiplier.

Comme vous êtes présumés ne pas être trop hermétique au sujet, reprenons directement l'exemple précédent.
     5   6   4  8   2   4
x   4   5   5  4   8   7
___________________

Voici un petit schéma qui reprend en un coup d'œil l'algorithme.


calculmental2.png


Merci encore à M.-E. CLAES.

A+-*/

PS: Correction faite, voilà qui est mieux; merci

#119 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 22-08-2010 09:43:31

Bonjour,

Impressionnante ta version 3, quelle rapidité.

La méthode de calcul de la racine carrée de 5 (avec crayon+papier) que j'ai utilisée diffère un peu.; elle ne prend qu'un chiffre à la fois ("chiffre par chiffre") et analyse si son "corps intérieur" ne dépasse pas le reste (c'est finalement une gestion des restes...)
Mais lorsque ça dépasse il faut que la machine puisse faire marche arrière et sans se tromper => travail sur les éléments des listes; on décrémentes, on delete,... mais une autre difficulté apparaîtt lorsqu'il s'agit des passages de dizaines à rebour car il y a plusieurs cas de figures.
Arrivé à 100 chiffres de phi je croyais être arrivé au bout de mes peines... que nenni! Poussant la machine à 200 chiffres je trouve un '-1'
pffffffff! allez! courage..
Et puis bingo... j'ai réinventé l'eau chaude ;-)

Merci pour les bonnes leçons de programmation.

A+-*/

#120 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 21-08-2010 14:02:44

r'lut,

Karlun a écrit :

(J'ai essayé de placer un compteur (p+=1) dans while(): mais un message TypeError: can only concatenate tuple (not "long") to tuple.)

Ce p ajouté, je voulais pouvoir le sortir de def rac5() et le lire afin de connaître le nombre d'opération effectuée dans while. (je m'emmêle les pinceaux avec les return x,y )

J'examine ta nouvelle version.

A+-*/

#121 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 21-08-2010 12:00:46

r'lut,

J'ai épluché ta dernière mouture:

Un calcul de départ est réalisé en posant    n,rac=5,2    bien vu.
(2 est la plus grande racine entière <5.)

J'imagine que (nbz) pourrait devenir (prc).

For et while font tout le boulot ensuite...
(J'ai essayé de placer un compteur (p+=1) dans while(): mais un message TypeError: can only concatenate tuple (not "long") to tuple.)
ensuite tu divises un nombre de 2000 chiffres augmenté d'un autre de 2000 chiffres en deux.
(Heureusement que Python à les capacités pour faire cela)

Pour ce qui est de str() j'vai aller voir car j'connais pas encore; mais ça semble ne faire qu'ajouter une virgule.

A+-*/

#122 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 21-08-2010 08:22:08

Bonjour,

Merci pour ta version; elle est beaucoup plus légère, limpide et 1000 fois (*20?) plus rapide.

Par simultanément j'entendais que la transposition de la "division à la main" en programme serait insérée de manière à être exécutée et le résultat placé dans la liste dès que un chiffre de la racine tombe .
C'est ce que je n'ai pas fait trop pressé d'arriver au but. J'ai  repris chaque chiffre de la racine et l'ai traité par la "division à la main" => perte de rendement.

En outre, j'ai placé un compteur de cycle interne... C'est que ça travaillait là dedans.
Pour 999 chiffres de phi, 26519 cycles...

Je m'étais astreint à  transposer en programme la méthode de résolution à la main de l'extraction de racine 5 et simultanément de la division par 2, histoire de me familiariser avec les conditionnelles (y a des fois où pfff! j'étais perdu... alors j'effaçais et je reprenais.) alors, forcément, le programme ne pouvait être rapide.

A la différence de ton programme, Yoshi, je pars de listes vides (sauf quand le cheval sent l'écurie) qui s'incrémentent d'une valeur (et augmente leur longueur d'une unité) à chaque chiffre calculé (comme la méthode à la main).

Merci.

A+-*/

#123 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 20-08-2010 21:22:34

'soir,

Un peu présomptueux sans doute....

Karlun a écrit :

Je transpose en programme la méthode de résolution à la main de l'extraction de racine 5 (augmentée d'une unité) et simultanément  la division par 2.

Là, un peu dans les nuages, j'émerge et me rends compte que, tel le cheval de retour à l'écurie, j'ai foncé vers la solution; le simultanément était mon idée mais il en est tout autre dans le prog. transmis. J'ai opéré la division après avoir calculé la racine; sans doute, tenir compte de cette remarque fera gagner du temps.

A+-*/

#124 Re : Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 20-08-2010 17:10:04

Salut,


Dans mes script je balise mes exercices comme des def.


Je lance comme une def à partir de >>>:
==============restart==============
          >>>
          >>>  extract_phi(w=10)
après avoir, au préalable, runner le programme (F5). (question d'assimiler à prompt les changements .)

Modifier l'indentation revient à, peut-être, tout foutre en l'air sauf si ce n'est que l'indentation liée à la def extract_phi(w=10): qui lance le programme au prompt.

Les programmes principaux sont à une indentation de plus que def extract_phi(w=10):

petit exemple: les 999 premiers chiffres de phi:

>>> extract_phi(w=1000)
[1, 6, 1, 8, 0, 3, 3, 9, 8, 8, 7, 4, 9, 8, 9, 4, 8, 4, 8, 2, 0, 4, 5, 8, 6, 8, 3, 4, 3, 6, 5, 6, 3, 8, 1, 1, 7, 7, 2, 0, 3, 0, 9, 1, 7, 9, 8, 0, 5, 7, 6, 2, 8, 6, 2, 1, 3, 5, 4, 4, 8, 6, 2, 2, 7, 0, 5, 2, 6, 0, 4, 6, 2, 8, 1, 8, 9, 0, 2, 4, 4, 9, 7, 0, 7, 2, 0, 7, 2, 0, 4, 1, 8, 9, 3, 9, 1, 1, 3, 7, 4, 8, 4, 7, 5, 4, 0, 8, 8, 0, 7, 5, 3, 8, 6, 8, 9, 1, 7, 5, 2, 1, 2, 6, 6, 3, 3, 8, 6, 2, 2, 2, 3, 5, 3, 6, 9, 3, 1, 7, 9, 3, 1, 8, 0, 0, 6, 0, 7, 6, 6, 7, 2, 6, 3, 5, 4, 4, 3, 3, 3, 8, 9, 0, 8, 6, 5, 9, 5, 9, 3, 9, 5, 8, 2, 9, 0, 5, 6, 3, 8, 3, 2, 2, 6, 6, 1, 3, 1, 9, 9, 2, 8, 2, 9, 0, 2, 6, 7, 8, 8, 0, 6, 7, 5, 2, 0, 8, 7, 6, 6, 8, 9, 2, 5, 0, 1, 7, 1, 1, 6, 9, 6, 2, 0, 7, 0, 3, 2, 2, 2, 1, 0, 4, 3, 2, 1, 6, 2, 6, 9, 5, 4, 8, 6, 2, 6, 2, 9, 6, 3, 1, 3, 6, 1, 4, 4, 3, 8, 1, 4, 9, 7, 5, 8, 7, 0, 1, 2, 2, 0, 3, 4, 0, 8, 0, 5, 8, 8, 7, 9, 5, 4, 4, 5, 4, 7, 4, 9, 2, 4, 6, 1, 8, 5, 6, 9, 5, 3, 6, 4, 8, 6, 4, 4, 4, 9, 2, 4, 1, 0, 4, 4, 3, 2, 0, 7, 7, 1, 3, 4, 4, 9, 4, 7, 0, 4, 9, 5, 6, 5, 8, 4, 6, 7, 8, 8, 5, 0, 9, 8, 7, 4, 3, 3, 9, 4, 4, 2, 2, 1, 2, 5, 4, 4, 8, 7, 7, 0, 6, 6, 4, 7, 8, 0, 9, 1, 5, 8, 8, 4, 6, 0, 7, 4, 9, 9, 8, 8, 7, 1, 2, 4, 0, 0, 7, 6, 5, 2, 1, 7, 0, 5, 7, 5, 1, 7, 9, 7, 8, 8, 3, 4, 1, 6, 6, 2, 5, 6, 2, 4, 9, 4, 0, 7, 5, 8, 9, 0, 6, 9, 7, 0, 4, 0, 0, 0, 2, 8, 1, 2, 1, 0, 4, 2, 7, 6, 2, 1, 7, 7, 1, 1, 1, 7, 7, 7, 8, 0, 5, 3, 1, 5, 3, 1, 7, 1, 4, 1, 0, 1, 1, 7, 0, 4, 6, 6, 6, 5, 9, 9, 1, 4, 6, 6, 9, 7, 9, 8, 7, 3, 1, 7, 6, 1, 3, 5, 6, 0, 0, 6, 7, 0, 8, 7, 4, 8, 0, 7, 1, 0, 1, 3, 1, 7, 9, 5, 2, 3, 6, 8, 9, 4, 2, 7, 5, 2, 1, 9, 4, 8, 4, 3, 5, 3, 0, 5, 6, 7, 8, 3, 0, 0, 2, 2, 8, 7, 8, 5, 6, 9, 9, 7, 8, 2, 9, 7, 7, 8, 3, 4, 7, 8, 4, 5, 8, 7, 8, 2, 2, 8, 9, 1, 1, 0, 9, 7, 6, 2, 5, 0, 0, 3, 0, 2, 6, 9, 6, 1, 5, 6, 1, 7, 0, 0, 2, 5, 0, 4, 6, 4, 3, 3, 8, 2, 4, 3, 7, 7, 6, 4, 8, 6, 1, 0, 2, 8, 3, 8, 3, 1, 2, 6, 8, 3, 3, 0, 3, 7, 2, 4, 2, 9, 2, 6, 7, 5, 2, 6, 3, 1, 1, 6, 5, 3, 3, 9, 2, 4, 7, 3, 1, 6, 7, 1, 1, 1, 2, 1, 1, 5, 8, 8, 1, 8, 6, 3, 8, 5, 1, 3, 3, 1, 6, 2, 0, 3, 8, 4, 0, 0, 5, 2, 2, 2, 1, 6, 5, 7, 9, 1, 2, 8, 6, 6, 7, 5, 2, 9, 4, 6, 5, 4, 9, 0, 6, 8, 1, 1, 3, 1, 7, 1, 5, 9, 9, 3, 4, 3, 2, 3, 5, 9, 7, 3, 4, 9, 4, 9, 8, 5, 0, 9, 0, 4, 0, 9, 4, 7, 6, 2, 1, 3, 2, 2, 2, 9, 8, 1, 0, 1, 7, 2, 6, 1, 0, 7, 0, 5, 9, 6, 1, 1, 6, 4, 5, 6, 2, 9, 9, 0, 9, 8, 1, 6, 2, 9, 0, 5, 5, 5, 2, 0, 8, 5, 2, 4, 7, 9, 0, 3, 5, 2, 4, 0, 6, 0, 2, 0, 1, 7, 2, 7, 9, 9, 7, 4, 7, 1, 7, 5, 3, 4, 2, 7, 7, 7, 5, 9, 2, 7, 7, 8, 6, 2, 5, 6, 1, 9, 4, 3, 2, 0, 8, 2, 7, 5, 0, 5, 1, 3, 1, 2, 1, 8, 1, 5, 6, 2, 8, 5, 5, 1, 2, 2, 2, 4, 8, 0, 9, 3, 9, 4, 7, 1, 2, 3, 4, 1, 4, 5, 1, 7, 0, 2, 2, 3, 7, 3, 5, 8, 0, 5, 7, 7, 2, 7, 8, 6, 1, 6, 0, 0, 8, 6, 8, 8, 3, 8, 2, 9, 5, 2, 3, 0, 4, 5, 9, 2, 6, 4, 7, 8, 7, 8, 0, 1, 7, 8, 8, 9, 9, 2, 1, 9, 9, 0, 2, 7, 0, 7, 7, 6, 9, 0, 3, 8, 9, 5, 3, 2, 1, 9, 6, 8, 1, 9, 8, 6, 1, 5, 1, 4, 3, 7, 8, 0, 3, 1, 4, 9, 9, 7, 4, 1, 1, 0, 6, 9, 2, 6, 0, 8, 8, 6, 7, 4, 2, 9, 6, 2, 2, 6, 7, 5, 7, 5, 6, 0, 5, 2, 3, 1, 7, 2, 7, 7, 7, 5, 2, 0, 3, 5, 3, 6, 1, 4, 1, 8]
>>>

A+-*/

#125 Programmation » [python] chiffre par chiffre, nombre d'or phi illimité. » 20-08-2010 14:01:53

karlun
Réponses : 40

Salut,

Nanti que de mes pauvres +-*/, et autres bricoles, je me suis lancé dans la programmation.
J'ai parcouru un peu le livre " Apprendre à programmer avec Python" (<p.100) .

Je me suis proposé de créer un programme capable d'énumérer, chiffres après chiffres, le nombre d'or.
L'idée est de partir de phi= [tex]\frac{1+\sqrt{5}}{2}[/tex].
Je transpose en programme la méthode de résolution à la main de l'extraction de racine 5 (augmentée d'une unité) et simultanément  la division par 2.

Pffffff! Y a des fois où j'ai ramé.
Mais, obstiné ;-), amusé surtout, j'y suis arrivé.

Bien sûr il y aura beaucoup de remarques à faire:
temps de calcul
raccourcis de consignes,
Etc. Etc.

(J'ai laissé des #print ...  ça et là qui m'ont aidé à analysé et résoudre les erreurs.)


# -*- coding: cp1252 -*-
from math import*
    #=============================================
    #  extraction à la main de phi (1.618033....)
    #=============================================
def extract_phi(w=10):
    "extraction à la main de phi (x-1=nbre de chiffre)"
   
    #======================================
 # 1)     extraction à la main de racine de 5
    #======================================
   
    def racinePlus(v,r,t):
        "place dans les listes ra,re,tot les résultats calculés"
        ra.append(v)
        re.append(r)
        tot.append(t)
        return ra

    def racineMoins(m):
        "enlève des listes le dernier élément"
        del ra[m]
        del re[m]
        del tot[m]
        return ra

    def travRacine(ra,re,tot,z,t):
        ra[z-2]=ra[z-2]-1
        re[z-2]=re[z-2]+40
        racineMoins(z-1)
        return ra,re,tot,z          

    #première étape: amorce de l'extraction de racine 5
    v=int(sqrt(5.))
    r=10
    t,p,x=0,0,w
    ra=[]
    re=[]
    tot=[]
    racinePlus(v,r,t)
    z=len(ra)
    #Et c'est parti pour des tours.

    while(len (ra)<w):
         #calculs intérieurs => caculer t à partir des listes existantes
       
        p+=1
        a,b,t,=0,0,0,
        c=(z+1)/2
        if(((z)%2)):                # =>z+1 est paire
            while(a<(c-1)):
                t=t+2*(ra[c-1-a]*ra[c+b])
                a=a+1
                b=b+1
        else:                       #=> z+1 est impaire
            while(a<(c-1)):
                t=t+2*(ra[c-1-a]*ra[c+1+b])
                a=a+1
                b=b+1
            t=t+ra[c]**2
        #comparaison t doit être < que le reste: si non on dégraisse
       
        for i in xrange(ra[z-1],0,-1):
            if(t>re[z-1]):
                ra[z-1]=ra[z-1]-1
                re[z-1]=re[z-1]+40
                tot[z-1]= tot[z-1]
                t=t-4
                #dégraissage accompli
                #je laisse les print d'analyse pour les amateurs
                #if (p>x-2):
                    #print "*",ra[z-5],ra[z-4],ra[z-3],ra[z-2],ra[z-1]
                    #print re[z-5],re[z-4],re[z-3],re[z-2],re[z-1],"    t:",t
                    #print tot[z-5],tot[z-4],tot[z-3],tot[z-2],tot[z-1]
                    #print"==================================================="


               
        if(ra[z-1]<=0):
            if(t>=re[z-1]):
                i,j=0,1
                while(i<j):
                    t=tot[z-1]-4                   #pour conserver t après travRacine
                    travRacine(ra,re,tot,z,t)
                    z=len(ra)
                    if(ra[z-1]==0):                 #cas où 1-1=0
                        if(t>re[z-1]):
                            j=j+1
                        else:
                            j=j
                    else:
                        if(ra[z-1]==-1):            #cas où 0-1=-1
                            j=j+1
                        else:
                            j=j
                    #if (p>x-2):
                        #print "**",ra[z-5],ra[z-4],ra[z-3],ra[z-2],ra[z-1]
                        #print re[z-5],re[z-4],re[z-3],re[z-2],re[z-1],"    t:",t
                        #print tot[z-5],tot[z-4],tot[z-3],tot[z-2],tot[z-1]
                        #print"==================================================="

                    i+=1
        #if (p>x-2):
            #print "fin cycle (analyse)"
        #ajout de la nouvelle racine (ra,re,tot)
        v=(re[z-1]-t)/4
        if(v>9):
            v=9
        r=(re[z-1]-(4*v+t))*10
        racinePlus(v,r,t)
        z=len(ra)
        #if (p>x-2):
            #print "***",v,r,t
       
    #print "nbre de cycles:   ",p
    #print "nombre de termes:   ",len(ra)
    #print ra

    #========================================
  # 2) division à la main de (racine de 5)+1
    #========================================
    # (1+racine5)/2
   
    i=0
    ra[i]+=1
    quot,reste=[],[]
    def ajoutListe(q,r):
        quot.append(q)
        reste.append(r)
    q=ra[i]/2
    r=(ra[i]-q*2)*10+ra[i+1]
    i=1
    ajoutListe(q,r)
    while((len(quot)+1)<w):
        q=r/2
        r=(reste[i-1]-q*2)*10+ra[i+1]
        ajoutListe(q,r)
        i+=1
    print quot

Vos remarques, commentaires, conseils sont les bienvenus.

A+-*/

Pied de page des forums