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

#1 20-07-2024 14:43:46

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Période de quotients de fractions.Curiosité.

Bonjour,

Comme souvent,une question me vient et je m’y colle, m’y  accroche.
Cette fois je me suis demandé si on avait étudier les périodes d’un quotient de deux rationnels.
Pour m’aider à en rencontrer j’ai codé en python un petit algorithme que j(ai le plaisir de partager.
A noter que j’ai dû affronter les x10**- 20 qui « imprécise » le résultat. J’ai résolu à ma manière cette logique imprécision.
Quel fut ma surprise quand j’ai chercher  la période du quotient de la fraction suivante :
6227.378  /  33.34
la période est longue de 875448 chiffres.
Sans python, « à la main », j’en aurais pour une éternité…


n=input()
m=input()
##n=6227.378
##m=33.34
v,w=0,0
num=float(n)
dnom=float(m)
a=list(str(n))
b=list(str(m))
if"." in a:
    v=len(a[a.index("."):])-1
if"." in b:
    w=len(b[b.index("."):])-1  
m=(max(v,w))
num*=10**int(m)
dnom*=10**int(m)
num=int(num)
dnom=int(dnom)
print("num",num," / ",dnom,"dnom")
print("num/dnom = ",num/dnom)
sol=[]
v,n,r=0,1,24
while v<2000+r: #############  nbre de décimales = v-1  ##########################  
    i=0
    while num>dnom:
        i+=1
        num=num-dnom
    sol.append(int(i))
    num=num*10
    v+=1
##print()
print("sol",sol)
print()
   #######  début de la période   #########
inf,sup=[],[]
l=len(sol)
n=1
while n<l:
    inf=sol[r-3:r+3]
    sup=sol[r+n-3:r+n+3]
    li=len(sol[r-3:r+3])
    if sup==inf:
        print("la période = ",sol[r:r+n])
        print("longueur = ",len(sol[r:r+n]))
        print(n)
        break          
    n+=1
print("fin")
 

Dernière modification par renéb (06-08-2024 23:41:34)

Hors ligne

#2 20-07-2024 22:39:31

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

Hello,
Ben non,
Je suis embêter de devoir rectifier le tir.
A cause de ces foutus x*10**-20 mon code s'est pris les +-*/ dans le tapis.
mais maintenant cela semble plus correcte.

num 627378  /  33340 dnom
num/dnom =  18.81757648470306
sollution en 7501 lignes de chiffres

la période =  [5, 5, 2, 4, 8,...1, 2, 2, 3, 7]
longueur =  833.

c'est plus raisonnable.

Bonne fin de journée.

Hors ligne

#3 21-07-2024 19:15:03

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

Joli travail...

Mais, réneb a écrit :

(...) ces foutus x*10**-20 (...)

Pas saisi ! Je n'ai rien vu de tes x*10**-20. Explication ?

Bon, je n'ai pas compris non plus ta méthode de détermination de la longueur de la période : elle est très rapide (!) et les stats que j'ai faites à partir de ta période calculée semblent confirmer qu'elle est exacte...
Quand j'aurais pigé, je récrirais le tout  à ma façon (c'est pas pour tout de suite).

réneb a écrit :

A cause de ces foutus x*10**-20, mon code s'est pris les +-*/ dans le tapis.
mais maintenant cela semble plus correct.

Là, si tu n'as remarqué que dans ton premier post le numérateur était 6227.378 et dans ton rectificatif 627.378, cela peut expliquer que ta période n'ait plus que 833 chiffres.
En fait, la division standard en Python n'offre qu'environ 16/17 chiffres significatifs.
Bon, on peut toujours ruser...
Ainsi, par exemple, mon premier ordi a été un Amstrad CPC 3128 à disquettes et le langage de programmation fourni était le BASIC Locomotive qui ne permettait d'avoir que 6 à 7 décimales exactes.
J'avais dû ruser pour obtenir la valeur du nombre d'or avec 100 décimales exactes : 1 h de calcul.
J'avaos récrit les 4 opérations et le calcul de la racine carrée...

Heureusement, on n'en est plus là : Python dispose nativement du module decimal qui contient la classe Decimal et qui permet de choisir le nombre de chiffres significatifs avec lesquels on veut calculer...
Dans le script qui donne des stats ci-dessous, je fais appel à lui et je demande 3360 signes significatifs.
J'ai d'abord, via le module fractions et la classe Fraction, commencé par chercher la fraction irréductible correspondant à 627378 /33340.
N-B : j'aurais pu aussi importer depuis le module math la classe gcd (greatest common divisor), calculer le PGCD du numérateur et dénominateur et simplifier la fraction comme à la main en classe de 3e...


from fractions import Fraction as F
from decimal import Decimal as D, getcontext
getcontext().prec=3360 # nombre de chiffres significatifs

num,dnom=627378,33340
f=F(num,dnom)
print("Fraction simplifiée :",f)
print()      
num=f.numerator
dnom=f.denominator
q=D(num)/D(dnom)  #division avec Décimaux Python et non pas des flottants...
Q=str(q)
l=len(Q)
pos=Q.find(".")
print ("Nombre de décimales :", l-pos-1,"chiffres")
Per='55248950209958008398320335932813437312537492501499700059988002399520095980803839232153569286142771445710857828434313137372525494901019796040791841631673665266946610677864427114577084583083383323335332933413317336532693461307738452309538092381523695260947810437912417516496700659868026394721055788842231553689262147570485902819436112777444511097780443911217756448710257948410317936412717456508698260347930413917216556688662267546490701859628074385122975404919016196760647870425914817036592681463707258548290341931613677264547090581883623275344931013797240551889622075584883023395320935812837432513497300539892021595680863827234553089382123575284943011397720455908818236352729454109178164367126574685062987402519496100779844031193761247750449910017996400719856028794241151769646070785842831433713257348530293941211757648470305938812237'
print("Longueur de la période :", len(Per),"chiffres")
print("Longueur du quotient :", len(Q),"chiffres")
print ()
print("La période calculée est-elle bien présente dans le quotient ?", Per in Q)
print("Combien de fois ?" , Q.count(Per),"fois")
 

Ma machine n'est pas une bête de course, elle est moyenne mais avec 16 Go de RAM...
J'ai récupéré, avec ton script, la période de 833 caractères.
Mon script une fois lancé s'arrête presque instantanément avec juste un léger hoquet malgré les 3358 décimales et les 2 dernières demandes.
Sortie :

Fraction simplifiée : 313689/16670

Nombre de décimales : 3358 chiffres
Longueur de la période : 833 chiffres
Longueur du quotient : 3361 chiffres

La période calculée est-elle bien présente dans le quotient ? True
Combien de fois ? 4 fois

Et bien, conclusion, ta méthode est apparemment fonctionnelle, puisque cette période est bien comprise dans mon quotient et présente 4 fois : 833 * 4 =  3332, 3332 <3358
Il faut attendre les 23e et 24e décimales pour que commence la première occurrence de la période dans le quotient.

@+

Dernière modification par yoshi (21-07-2024 21:33:59)


Arx Tarpeia Capitoli proxima...

Hors ligne

#4 22-07-2024 00:22:14

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

bonsoir,

ces foutus x*10**-20

exagération dues à l'agacement de ces logiques ajouts  d'   X *10**-Y  " ,  lors d'opérations du genre:

n=25.9   
m=n-intn)
print(m)

m=   0.8999999999999986

et pas m = 0.9
c'est sans doute à cause de cette différence (0.8999999999999986  au lieu de 0.9) que le résultat était beaucoup plus élevé

le numérateur était 6227.378 et dans ton rectificatif 627.338

faute de frappe... excuses.

Il faut attendre les 23e et 24e décimales pour trouver le début de la première occurrence de la période.

Voila de quoi m'occuper.

Pour ce qui est de chasser les  décimales de la fraction, je passe par l'analyse de son "image"  afin de déterminer le nombre de fois qu'il faudra multiplier le numérateur et le dénominateur.
par 10.
Simple et infallible.

A bientôt.

Hors ligne

#5 22-07-2024 19:08:19

DrStone
Membre
Inscription : 07-01-2024
Messages : 209

Re : Période de quotients de fractions.Curiosité.

Bonsoir.

renéb a écrit :

bonsoir,
n=25.9   
m=n-intn)
print(m)

m=   0.8999999999999986

et pas m = 0.9

Ceci est dû à la manière même dont les nombres flottants (a.k.a. nombres "réels") sont gérés au niveau binaire par un ordinateur. Je vous invite à chercher «pourquoi 0.1+0.2=0.30000000000000004 ?».

Hors ligne

#6 22-07-2024 21:00:59

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

DrStone a raison, c'est une "curiosité" à connaître : un certain nombre de personnes venant sur le forum s'était alarmé de ce phénomène pensant que Python calculait faux...
Le module decimal permet avec précautions de contourner le problème...
Mais, puisque tu as écrit :

Pour ce qui est de chasser les  décimales de la fraction, je passe par l'analyse de son "image"  afin de déterminer le nombre de fois qu'il faudra multiplier le numérateur et le dénominateur.
par 10.
Simple et infaillible.

j'en conclus que tu ne veux rien savoir de ce module decimal...

Je te propose alors une autre façon de chasser les décimales de la fraction.
Connais-tu l'instruction divmod ?
Sa syntaxe est


q,r = divmod(125,13)
print("le quotient est",q,"et le reste",r)
 

qui renvoie :

le quotient est 9 et le reste 8

En effet, 13*9+8 =125...

J'ai donc écrit le programme suivant :


from decimal import Decimal as D, getcontext
getcontext().prec=104

z=0
num,dnom=627378,33740
q,r=divmod(num,dnom)
Q=str(q)+"."
fin=96
for i in range(fin):
    num=r*10  
    while num<dnom:
        Q+="0"
        num*=10
        z+=1
    q,r=divmod(num,dnom)
    Q+=str(q)
         
print("Comparaison des quotients obtenus avec les 2 méthodes :")
print("1. avec divmod. et les chaînes")
print(Q)
print("2. Avec le module decimal")
print(D(627378)/D(33740))
print()
print("Recherche si la chaîne T= 7255 est comprise dans la chaîne Q :")
T="7255"
print (T in Q)
 

Je n'ai utilisé aucun nombre décimal, le quotient Q est une chaîne de caractères.
Et pour la recherche de la période, je n'ai pas besoin de décimaux.
Je n'ai toujours pas réfléchi à ta méthode de recherche, mais lorsque j'aurai pris le temps de chercher, je suis sûr que je pourrai me passer de nombres décimaux, même avec 2024 caractères après le ".",comme testé en fin de code...
Si la réponse avait été négative, la ligne print(T in Q) aurait renvoyé False

Le code ci-dessus renvoie :

Comparaison des quotients obtenus avec les 2 méthodes :
1. Avec divmod. et les chaînes
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

2. Avec le module decimal
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

Recherche si la chaîne T = 7255 est comprise dans la chaîne Q :
True

@+

[EDIT]
Sur ce site, une discussion à propos du phénomène signalé par DrStone et qui te trouble :
https://www.bibmath.net/forums/viewtopi … 864#p92864


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 22-07-2024 22:43:37

DrStone
Membre
Inscription : 07-01-2024
Messages : 209

Re : Période de quotients de fractions.Curiosité.

Bonsoir.

Une autre manière de procéder et d'utiliser une variable epsilon "très" petite afin de vérifier si la différence est suffisamment proche de $0$. Si c'est le cas, on peut alors supposer que les deux nombres sont égaux.
Par exemple, dans le cas de la vérification $0,1+0,2=0,3$, on peut réaliser cela par


>>> eps=1e-9
>>> a=0.1+0.2 # 0.30000000000000004
>>> b=0.3     # 0.3
>>> abs(a-b)<eps
True
 

C'est peu ou prou ce qui est utilisé par python avec la fonction math.isclose dont on peut voir l'implémentation en C ici : https://github.com/python/cpython/blob/ … le.c#L3152.

Hors ligne

#8 22-07-2024 23:41:30

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

j'en conclus que tu ne veux rien savoir de ce module decimal...

Que nenni. j'ai tant à apprendre.
L'efficacité du recourt à l'"image" me plait et ne va pas m'empêcher d'essayer de comprendre et de réfléchir à ce que vous me proposez.

Hors ligne

#9 23-07-2024 13:15:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Re,

ok...
Mais l'utilisation basique que je fais de la classes Decimal du module decimal est suffisante pour obtenir des nombres décimaux avec un nombre de chiffres décimaux exacts considérable...
Dans mon post #3, les 3360 chiffres significatifs demandés sont une "broutille" en regard de ce qu'on peut faire en théorie avec assez de RAM :
     32 bits                   64 bits
425 000 000      99 999 999 999 9999 999


Dans mon système avec divmod, je procède comme pour une division à la main (comme je l'avais apprise, il y a longtemps en primaire)
sauf que je démarre après le quotient de 18


627378                       | 33740      
289978                       | 18.594...
 200580                      |
  318800                     |
   151400                    |
    16440
    (...)

Le premier reste est alors de 20058, à la main, on abaisse un zéro, ce qui revient à multiplier ce reste par 10 d'où le zéro bleu en fin de reste...
Mais je dois prévoir le cas où multiplier ce reste par 10 ne suffit pas, alors j'ajoute str(0)  soit "0" au quotient chaîne, et je remultiplie ce reste à nouveau par 10, etc...

Quant à ma variable z, elle compte le nombre de zéros du quotient : 6...
Ma boucle for produit :
96 décimales + 6 zéros = 102 chiffres
Le quotient commence en outre par 18.
J'ai donc 104 chiffres, ce qui colle avec le getcontext().prec=104.
En constatant que les 2 quotients n'avaient par la même longueur, je me suis douté que le "problème" venait des zéros, j'ai donc ajouté le "mouchard" z pour vérifier et ainsi, j'ai pu ensuite réduire la valeur de fin de boucle...
Après quoi la vérification chiffre à chiffre ne comprenait plus d'éléments "parasites"...

Bon, c'était marrant à faire, mais pas trop évident à mettre au point... Je n'en ai pas été choqué, ayant été biberonné depuis mes débuts à l'aphorisme : "un script informatique ne marche toujours pas du premier coup !".
D'ailleurs, il n'est pas exclu que je remplace la boucle for par une boucle while....

Je préfère de loin ne pas me fatiguer et importer la classe Decimal du module decimal en début de script :


from decimal import Decimal as D, getcontext
getcontext().prec=104

Je dois me rappeler de ne pas mélanger entier et Decimal, Decimal et flottant, c'est tout. Après quoi, j'utilise normalement les opérations...
Le D est un alias que j'ai choisi, il m'évite d'avoir à écrire Decimal() en entier : quand je disais que je ne voulais pas me fatiguer... ^_^
Avec la méthode de Heron d'Alexandrie, et en utilisant la classe Decimal du module decimal et en demandant 20000 chiffres significatifs, je calcule la valeur du nombre d'or :
* en 0,59 s
* avec seulement 14 itérations
L'affichage du nombre ne se fait pas, il prendrait trop de temps et de place : 201 lignes...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 23-07-2024 20:02:27

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

bonsoir,

J'ai fait tourner la fraction de l'exemple poste  #3 à savoir:


avec le code suivant:

   
##n=input()
##m=input()
n=313689
m=16670
print("fraction:",n," / ",m)
print()
v,w=0,0
num=float(n)
dnom=float(m)
a=list(str(n))
b=list(str(m))
if"." in a:
    v=len(a[a.index("."):])-1
if"." in b:
    w=len(b[b.index("."):])-1  
max=(max(v,w))
num*=10**int(max)
dnom*=10**int(max)
##num=int(num)
##dnom=int(dnom)
print("num",num," / ",dnom,"dnom")
print("num/dnom = ",num/dnom)
sol=[]
v,r=0,0
while v<20000: #############  nbre de décimales voulues ##########################  
    i=0
    while num>dnom:
        i+=1
        num=num-dnom
    sol.append(int(i))
    num=num*10
    v+=1
print("sol",sol)
print()
#######  début de la période   #########
inf,sup=[],[]
l=len(sol)
n,p,j,t=1,6,0,30
#### t : espace pour les premières décimales ne rentrant pas dans la période.
#### n=1 pour décaler la première recherche d'égalité.
#### p=largeur de la palette de recherche.
while n<l:
    inf=sol[r+t:r+t+p]
    sup=sol[r+n+t:r+n+t+p]
    if sup==inf:
        print("une période = ",sol[r+t:r+t+10],"...  ...",sol[r+n+t-10:r+n+t])
        print()
        break          
    n+=1
while sol[r+t-j]==sol[r+t+n-j]:
    j+=1
print("premiére période ",sol[r+t-j+1:n+r+t-j+1])
print("elle commence à la ",r+t-j+1,"ième position)")
print("d'une longueur de ",len(sol[r+t-j+1:n+r+t-j+1]),"chiffres")
q=(sol[n-5:n+r+t-j+9])
print("recouvrement de la série:",q)
 

Long code quand même...
comment le rendre plus joli?

Je souhaite naviguer dans le résultat ; il y a des outils qui existent mais je ne les connais et ne les métrise pas trop bien.
( index, pop, keys, items, ...)

Mais je vais me pencher plus avant sur toutes les interventions que vous avez daigner poster.

En vous remerciant, à bientôt.

rb


num,dnom=627378,33340
et je trouve les mêmes résultats ( ouf ! )

fraction: 313689  /  16670

num 313689.0  /  16670.0 dnom
num/dnom =  18.81757648470306

sol:  Squeezed text (751 lines)

une période =  [5, 0, 2, 0, 9, 9, 5, 8, 0, 0...  ... 2, 2, 3, 7, 5, 5, 2, 4, 8, 9]

premiére période  [1, 7, 5, 7, 6, 4, 8, 4, 7, 0, 3, 0, 5, 9, 3, 8, 8, 1, 2, 2, 3, 7, 5, 5, 2, 4, 8, 9, 5, 0, 2, 0, 9, 9, 5, 8, 0, 0, 8, 3, 9, 8, 3, 2, 0, 3, 3, 5, 9, 3, 2, 8, 1, 3, 4, 3, 7, 3, 1, 2, 5, 3, 7, 4, 9, 2, 5, 0, 1, 4, 9, 9, 7, 0, 0, 0, 5, 9, 9, 8, 8, 0, 0, 2, 3, 9, 9, 5, 2, 0, 0, 9, 5, 9, 8, 0, 8, 0, 3, 8, 3, 9, 2, 3, 2, 1, 5, 3, 5, 6, 9, 2, 8, 6, 1, 4, 2, 7, 7, 1, 4, 4, 5, 7, 1, 0, 8, 5, 7, 8, 2, 8, 4, 3, 4, 3, 1, 3, 1, 3, 7, 3, 7, 2, 5, 2, 5, 4, 9, 4, 9, 0, 1, 0, 1, 9, 7, 9, 6, 0, 4, 0, 7, 9, 1, 8, 4, 1, 6, 3, 1, 6, 7, 3, 6, 6, 5, 2, 6, 6, 9, 4, 6, 6, 1, 0, 6, 7, 7, 8, 6, 4, 4, 2, 7, 1, 1, 4, 5, 7, 7, 0, 8, 4, 5, 8, 3, 0, 8, 3, 3, 8, 3, 3, 2, 3, 3, 3, 5, 3, 3, 2, 9, 3, 3, 4, 1, 3, 3, 1, 7, 3, 3, 6, 5, 3, 2, 6, 9, 3, 4, 6, 1, 3, 0, 7, 7, 3, 8, 4, 5, 2, 3, 0, 9, 5, 3, 8, 0, 9, 2, 3, 8, 1, 5, 2, 3, 6, 9, 5, 2, 6, 0, 9, 4, 7, 8, 1, 0, 4, 3, 7, 9, 1, 2, 4, 1, 7, 5, 1, 6, 4, 9, 6, 7, 0, 0, 6, 5, 9, 8, 6, 8, 0, 2, 6, 3, 9, 4, 7, 2, 1, 0, 5, 5, 7, 8, 8, 8, 4, 2, 2, 3, 1, 5, 5, 3, 6, 8, 9, 2, 6, 2, 1, 4, 7, 5, 7, 0, 4, 8, 5, 9, 0, 2, 8, 1, 9, 4, 3, 6, 1, 1, 2, 7, 7, 7, 4, 4, 4, 5, 1, 1, 0, 9, 7, 7, 8, 0, 4, 4, 3, 9, 1, 1, 2, 1, 7, 7, 5, 6, 4, 4, 8, 7, 1, 0, 2, 5, 7, 9, 4, 8, 4, 1, 0, 3, 1, 7, 9, 3, 6, 4, 1, 2, 7, 1, 7, 4, 5, 6, 5, 0, 8, 6, 9, 8, 2, 6, 0, 3, 4, 7, 9, 3, 0, 4, 1, 3, 9, 1, 7, 2, 1, 6, 5, 5, 6, 6, 8, 8, 6, 6, 2, 2, 6, 7, 5, 4, 6, 4, 9, 0, 7, 0, 1, 8, 5, 9, 6, 2, 8, 0, 7, 4, 3, 8, 5, 1, 2, 2, 9, 7, 5, 4, 0, 4, 9, 1, 9, 0, 1, 6, 1, 9, 6, 7, 6, 0, 6, 4, 7, 8, 7, 0, 4, 2, 5, 9, 1, 4, 8, 1, 7, 0, 3, 6, 5, 9, 2, 6, 8, 1, 4, 6, 3, 7, 0, 7, 2, 5, 8, 5, 4, 8, 2, 9, 0, 3, 4, 1, 9, 3, 1, 6, 1, 3, 6, 7, 7, 2, 6, 4, 5, 4, 7, 0, 9, 0, 5, 8, 1, 8, 8, 3, 6, 2, 3, 2, 7, 5, 3, 4, 4, 9, 3, 1, 0, 1, 3, 7, 9, 7, 2, 4, 0, 5, 5, 1, 8, 8, 9, 6, 2, 2, 0, 7, 5, 5, 8, 4, 8, 8, 3, 0, 2, 3, 3, 9, 5, 3, 2, 0, 9, 3, 5, 8, 1, 2, 8, 3, 7, 4, 3, 2, 5, 1, 3, 4, 9, 7, 3, 0, 0, 5, 3, 9, 8, 9, 2, 0, 2, 1, 5, 9, 5, 6, 8, 0, 8, 6, 3, 8, 2, 7, 2, 3, 4, 5, 5, 3, 0, 8, 9, 3, 8, 2, 1, 2, 3, 5, 7, 5, 2, 8, 4, 9, 4, 3, 0, 1, 1, 3, 9, 7, 7, 2, 0, 4, 5, 5, 9, 0, 8, 8, 1, 8, 2, 3, 6, 3, 5, 2, 7, 2, 9, 4, 5, 4, 1, 0, 9, 1, 7, 8, 1, 6, 4, 3, 6, 7, 1, 2, 6, 5, 7, 4, 6, 8, 5, 0, 6, 2, 9, 8, 7, 4, 0, 2, 5, 1, 9, 4, 9, 6, 1, 0, 0, 7, 7, 9, 8, 4, 4, 0, 3, 1, 1, 9, 3, 7, 6, 1, 2, 4, 7, 7, 5, 0, 4, 4, 9, 9, 1, 0, 0, 1, 7, 9, 9, 6, 4, 0, 0, 7, 1, 9, 8, 5, 6, 0, 2, 8, 7, 9, 4, 2, 4, 1, 1, 5, 1, 7, 6, 9, 6, 4, 6, 0, 7, 0, 7, 8, 5, 8, 4, 2, 8, 3, 1, 4, 3, 3, 7, 1, 3, 2, 5, 7, 3, 4, 8, 5, 3, 0, 2, 9, 3, 9, 4, 1, 2, 1]
elle commence à la  2 ième position)
d'une longueur de  833 chiffres
recouvrement de la série: [... 9, 3, 9, 4, 1, 2, 1, 1, 7, 5, 7, 6, 4, 8, 4,...]

Dernière modification par renéb (08-08-2024 15:18:07)

Hors ligne

#11 23-07-2024 21:22:43

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

Tu trouves plusieurs périodes ?...
Impossible...
La fin d'une période est suivie immédiatement de la même : elles s'enchaînent sans espaces, c'est la définition de la période...
Voilà ce que je veux dire soit la période 237 d. voilà un exemple de ce que ça peut donner
24,237237237237237...
Je vais rechercher la fraction qui lui donne naissance
$x=24,237237237237237...$
$1000x =24237,237237237237237...$
$999x = 24237-24 =24213$
La fraction est donc $\dfrac{24213}{999}$


from decimal import Decimal as D, getcontext
getcontext().prec=90
 
print(D(24213)/D(999))

renvoie :
24.2372372372372372372372372372372372372372372372372372372372372372372372372372372372372372

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#12 23-07-2024 22:09:51

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

bonsoir,

Tu trouves plusieurs périodes ?...

non pas plusieurs périodes mais bien leurs points d'amorce qui peut être au nombre d'éléments de la période.
L'amorce peut se faire à partir de n'importe quelle décimale pour autant qu'elle soit suffisamment éloignée  de la partie entière de la fraction.

La fin d'une période est suivie immédiatement de la même : elles s'enchaînent sans espaces, c'est la définition de la période...

C'est bien ce qui est indiquer dans "recouvrement de la série" de l'exemple ci-dessus.

A bientôt
rb

Hors ligne

#13 23-07-2024 22:18:59

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

re',
Quelques questions:

yoshi a écrit :

from decimal import Decimal as D, getcontext
getcontext().prec=104

pourquoi 104?

fin=96

96 ?
En tous cas divmod(x,y) semble génial.

rb

Hors ligne

#14 24-07-2024 12:37:19

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

RE,

Quelques questions:

renéb a écrit :

yoshi a écrit :

    from decimal import Decimal as D, getcontext
    getcontext().prec=104

pourquoi 104?

    fin=96

96 ?
En tous cas divmod(x,y) semble génial.

Diable !  J'avais prévu ces questions et rédigé des réponses, mais je constate que j'ai dû être distrait par autre chose et que je ne les ai pas ajoutées...
Pourquoi 104 ?
J'avais commencé par calculer divmod(623378,33740) et obtenu q= 18, r=16058.
En gros je voulais 100 décimales + le quotient entier de 2 chiffres, ça me donnait 102 chiffres significatifs + le point décimal : longueur 103, j'avais pris 104 pour faire bonne mesure.


j'avais pensé que ça rentrerait sur une ligne, c'était une erreur...
Chez moi, pendant la rédaction, un texte semble tenir sur une ligne, et après validation, surprise, il arrive que 1 ou 2 mots passent en ligne suivante, même si la taille prévue de la fenêtre d'écriture n'est pas fixée par moi.
Cependant avec un écran de 24 pouces, peut-être que les caractères n'ont pas la même largeur (je n'y crois pas).

Pourquoi 96 ? Comme fin de boucle, j'avais choisi 104... Et, surprise, j'avais eu deux affichages, l'un dû à print(D(623378),D(33740)) et l'autre à print(Q)...
Avec fin=104 pour la boucle de divmod, voilà l'affichage :

Comparaison des quotients obtenus avec les 2 méthodes :
1. Avec divmod. et les chaînes
18.5944872554831061055127445168938944872554831061055127445168938944872554831061055127445168938944872554831061055127

2. Avec le module decimal
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

Via divmod, et fin =104, par rapport à Decimal et getcontext().prec=104, j'avais calculé 10 décimales de trop : 1061055127

Nombre de décimales :
len(Q[3:]) = 112.
Je m'étais demandé pourquoi, alors que demandé 104 ?...
Et j'ai pensé Et si c'était à cause des zéros ?
Alors, j'ai inclus le décompte des zéros avec la variable z... Bingo ! z=8...
104+8=112
(je n'ai pas vérifié mon code pour rectifier cette anomalie).
A quoi il fallait ajouter 2 pour le 18 'hors boucle) et le . décimal...
Et en tâtonnant, je suis arrivé à 96.
Or, dans ces décimales de trop figurent 2 zéros supplémentaires. si je veux m'arrêter avant, il n'y aura plus que 6 zéros à décompter me suis-je dit.
Nouvel essai avec fin =98 :

1. Avec divmod. et les chaînes
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483106

Raté ! La boucle ne s'est pas arrêtée assez tôt : z=7 et j'avais encore un zéro de trop...
Alors j'ai tâtonné et je suis arrivé à fin =96...

Tu vois, même si j'ai manié les maths pendant 38 ans, quelquefois, je pense que ça ne vaut pas le coup que je me casse la tête...

Alors, hier soir, j'étais parti pour calculer la fraction d'origine avec la suite décimale périodique illimitée ci-dessous (c'était son nom , jusqu'à ce que cette notion sorte des programmes du Collège).
Donc, hier soir, j'étais parti pour te montrer comment on retrouve la fraction qui a donné naissance au nombre :
x=24,1237237237237237...

Et là, je m'aperçus que le 1 foutait en l'air la méthode que j'avais apprise et à mon tour, enseignée... Donc, prudemment, j'ai fait ma démo à partir de x=24,237237237237237...
Mais, dans mon lit, au lieu de dormir, j'y ai réfléchi un moment : là, ça valait le coup...) et j'ai rapidement trouvé la parade...
La voilà:
Soit $n=10x=241,237237237237237..$.
$1000n =241237,237237237237237...$
$1000n-n=999n =241237-241=240996
et :
$n =\dfrac{240996}{999}$
Or, $ n=10x$, donc $x=\dfrac{n}{10} =\dfrac{240996}{9990}$
Fraction que je simplifie :
$x=\dfrac{40166}{}$
Vérification :


from decimal import Decimal as D, getcontext
getcontext().prec=52

print( D(40166)/D(1665))

 

Résultat :
24.12372372372372372372372372372372372372372372372372

N-B : la méthode avec divmod n'est rien d'autre que l'écriture informatique de la division de 627378 par 33740 comme la feraient "à la main  ceux qui n'auraient pas oublié...

Savais-tu que du temps où le Collège n'existait pas, dans le programme de 4e au Lycée, on apprenait à calculer une racine carrée "à la main" (Ah, oui, précision : les calculatrices n'existaient pas encore).
Au passage je me suis amusé à la traduire en Python, c'est bien moins rapide que la méthode de Heron d'Alexandrie , mais ça marche bien...               

@+

[EDIT]
Rien à avoir, mais tu vas aimer...
nom=["R","E","N","E","B"]
Et à l'envers :
print (nom[::-1])
donne :
['B', 'E', 'N', 'E', 'R'].

Ca marche aussi avec les Chaînes :
C="ESOPE RESTE ICI ET SE REPOSE"
print(C[::-1]) :
'ESOPER ES TE ICI ETSER EPOSE'

Autre chose encore :
nom=["R","E","N","E","B"]
print(nom.index("N")) renvoie 2.
Les chaînes et listes commencent leur numérotation à 0 :

Liste : ["R","E","N","E","B"]
index :  0    1    2    3   4

Donc nom[4] --> 'B' même si c'est la 5e lettre.
Tu peux l'obtenir sans connaître son index :
print(nom[-1])-->

index c'est pour les listes, le mot-clé correspondant pour les chaines est find :
prenom = "ARTHUR"
print(prenom.find("H")) renvoie 3.
et si tu demandes print(prenom[3]), tu obtiens bien 'H'

Tu n'as pas besoin de numéros pour parcourir une liste (ou une chaîne) ni leur longueur :
for lettre in nom:
    print (lettre, end=" ")
te donne :
R E N E B

for lettre in prenom:
    print (lettre, end="    ")
te donne :
A    R    T    H    U    R

Tu peux avoir les deux numéros et éléments :
Nom=['J', 'e', 'a', 'n', '-', 'B', 'a', 'p', 't', 'i', 's', 't', 'e']
for i, lt in enumerate(Nom):
    print(i, lt)
donne :
0 J
1 e
2 a
3 n
4 -
5 B
6 a
7 p
8 t
9 i
10 s
11 t
12 e

A suivre...

Dernière modification par yoshi (24-07-2024 21:23:53)


Arx Tarpeia Capitoli proxima...

Hors ligne

#15 06-08-2024 14:59:30

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

Bonjour,

Curiosité encore:

Y aurait-il une période au multiplicateur que je cherche pour contrôler son produit.après qu’il ai été multiplié par le multiplicande
Autrement dit:
un multiplicande (23) multiplié par un multiplicateur (que je cherche)= un produit composé que, seulement, de 3 (par exemple) ?

Il m’aura fallu pas mal de temps pour traduire en python un algorithme capable de répondre à mes attentes. (Mais, somme toute, ce fut amusant).

Ben oui on remarque une période dans le multiplicateur.

Le voici :

i=23     # à partir de
p=3     #période
x,y,sol=[],[],[]
q,f=p,0
rep=0
for Z in range(0,10):   
        z=str(Z*i)
        y.append(int(z))       
        x.append(int(z[-1]))   
R,Sol=[0],[0]
while f<50:   
    r=0
    w=(x.index(q))             
    #print("index",w)   
    sol.insert(0,w)
    #print("sol",sol)
    v=str(y[w])   
    u=list(v)
    u.insert(0,str(0))
    u.insert(0,str(0))
    u.insert(0,str(0))
    R.append(u[-3])
    b=int(u[-2])+int(rep)+int(R[-2])   
    for r in range(p,90+p,10):
        if b<=r :
            rep=int(r/10)
            q=r-b
            break
    f+=1   
L=''
for G in sol:
        L=L+str(G)
L=int(L)
print("solution = ",L)
T=L*i
print("solution *",i,"=", T)
print("--------------------------------------------------")

Ce qui donne :

solution =  5797101449275362318840579710144927536231884057971
solution * 23 = 133333333333333333333333333333333333333333333333333
--------------------------------------------------

Et on remarque (144927536231884057971)  à partir du premier 0
    144927536231884057971 * 23 =
    3333333333333333333333

renéb

P S :    Comment faire pour que le code soit plus joli.

Hors ligne

#16 06-08-2024 18:02:24

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

renéb a écrit :

P S :    Comment faire pour que le code soit plus joli.

On peut comprendre ta demande de deux façons.
1. Modifier ton code, pour qu'il ne "gigote pas dans tous les sens".
    Pour cela, il faudrait que je comprenne les idées qui sont derrière l'algorithme que tu as inventé.
    Hélas, ce n'est pas demain la veille : il fait trop chaud pour cela...
2. Faire en sorte que ton code présente mieux (= soit plus joli à regarder à l'écran).
    Ça, en principe, c'est simple et est facile.
Comme ci-dessous ?

i=23     # à partir de
p=3     #période
x,y,sol=[],[],[]
q,f=p,0
rep=0
for Z in range(0,10):  
        z=str(Z*i)
        y.append(int(z))      
        x.append(int(z[-1]))  
R,Sol=[0],[0]
while f<50:  
    r=0
    w=(x.index(q))            
    #print("index",w)  
    sol.insert(0,w)
    #print("sol",sol)
    v=str(y[w])  
    u=list(v)
    u.insert(0,str(0))
    u.insert(0,str(0))
    u.insert(0,str(0))
    R.append(u[-3])
    b=int(u[-2])+int(rep)+int(R[-2])  
    for r in range(p,90+p,10):
        if b<=r :
            rep=int(r/10)
            q=r-b
            break
    f+=1  
L=''
for G in sol:
        L=L+str(G)
L=int(L)
print("solution = ",L)
T=L*i
print("solution *",i,"=", T)
print("--------------------------------------------------")

Ce qui donne :

solution =  5797101449275362318840579710144927536231884057971
solution * 23 = 133333333333333333333333333333333333333333333333333

Si oui, alors dans la barre d'outils des messages, tu pars de la fin et tu comptes 6 icônes : cette 6e icône est <>...
Si tu passes ta souris dessus, l'info-bulle qui apparaît te dit notamment :
Texte préformaté : [ code=langage]texte[ \code]
Donc
1. Tu sélectionnes ton code
2. tu cliques sur la balise code <>
3. Dans la balise de début, après code, tu ajoutes = Python.

C'est tout...
On ne met pas d'espace dans n'importe quelle balise. Pourtant, j'ai écrit ci-dessus :

[ code=langage]texte[ \code]

Je l'ai fait volontairement pour empêcher les balises code de fonctionner, et que tu puisses voir dans les balises dé début et de fin, le mot code...

@+

Dernière modification par yoshi (06-08-2024 18:36:01)


Arx Tarpeia Capitoli proxima...

Hors ligne

#17 06-08-2024 18:20:16

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

Bonjour,

Oui c'est bien ceci:

Faire en sorte que ton code présente mieux

Merci

rb

Hors ligne

#18 06-08-2024 18:39:10

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 101

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

Fausse manip : une combinaison de touches m'avait valider mes 3 lignes d'écriture.
J'ai pensé que tu n'allais pas repasser tout de suitez, alors j'ai choisi modifier et je l'ai complété...
Pas de bol, tu étais passé entre temps...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#19 06-08-2024 23:35:46

renéb
Membre
Inscription : 16-01-2023
Messages : 15

Re : Période de quotients de fractions.Curiosité.

Bonsoir,

Merci Yoshi; c'est vachement plus joli.

RB

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt quatorze moins vingt six
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums