Programme décimales de pi

Fermé
leodmca - 24 déc. 2022 à 17:20
Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 - 27 déc. 2022 à 08:51

Bonjour, j'ai besoin d'aide pour écrire un programme python qui calcule les fréquences d'apparition de séquences à chercher dans les décimales de pi.


Macintosh / Chrome 108.0.0.0

8 réponses

Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 916
26 déc. 2022 à 11:25

Bonjour 

si ton prof t'a donné cet exercice c'est qu'il juge que le niveau de son cours déjà enseigné le permet.

L'énoncé précise que la première fonction à coder devra construire un dictionnaire à partir d'une liste elle-même issue du fichier texte. C'est écrit comme si cela devrait être une formalité.

Du coup, je dirais que tu devrais commencer par réviser les cours précédents et refaire les exercices de lecture de fichiers textes et de constitution de liste.


2
Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 916
24 déc. 2022 à 17:32
1

Pouvez-vous m'aider à commencer svp ? Je ne sais pas par où commencer

0

Il faudrait commencer par calculer ces décimales. Sais-tu comment?

http://www.gecif.net/articles/mathematiques/pi/pi_decimales.html

1

j'ai un fichier .txt que le prof a donné avec 130 000 décimales de pi, donc j'ai extrait les décimales de pi, je l'ai mise dans une liste avec .readlines mais après je ne sais pas quoi faire

1

Le problème est qu'on ne connait pas à priori ni la composition, ni la longueur des séquences.
Ça serait ridicule de chercher des séqquences de un seul chiffre.
Il y a 100 séquences de deux chiffres, 1000 séquences de trois chiffres, etc.
Si tu as réussi à faire une seule chaîne en enlevant les '\n' avec replace, tu devrais n'avoir que des chiffres.
Il faudra décider de la puissance maximale, donc le nombre de chiffres, pour chaque séquence.
Je donne un exemple avec 3 chiffres:
w = 3   # largeur
for n in range(10**w):
    seq =str(10**w + a)[-w:]
    compte = decimales_de_pi.count(seq)
Ça, c'est pour une seule séquence de 3 chiffres. Il faut tester toutes les séquences de 3 chiffres.
Il faut surtout tester toutes les séquences de N chiffres, pour N de 2 à une certaine limite.

Avec de longues séquences, on pourrait utiliser l'algorithme de Boyer-Moore, mais c'est plus compliqué à coder.

Je commencerais avec des séquences de 2 ou 3 chiffres, car ça risque d'être long avec des séquences plus longues.

1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PierrotLeFou
25 déc. 2022 à 07:33

Mon code précédent est en effet assez long car on parcourt la chaîne des chiffres plusieurs fois.
J'ai trouvé du code plus rapide avec un dictionnaire. Je parcours la chaîne une seule fois, même si je prend des sous-chaînes comme séquences de chiffres.
Je crée un dictionnaire de toutes les possibilités avec une liste vide associée à chaque clé.
Même si plusieurs clés sont créés inutilement, ça semble plus rapide que de vérifier à chaque séquence si la clé existe, puis modifier sa valeur.
-
from time import perf_counter
from random import choices
n = 130000
# Je génère aléatoirement 130 000 chiffres pour la simulation.
pi = "".join(choices("0123456789", k=n))
p = 5   # Puissance maximale = nombre maximal de chiffres cherchés.
begin = perf_counter()
# Je génère un dictionnaire avec toutes les séquences de 2 à p chiffres.
D = {str(i+10**w)[-w:]: [] for w in range(2, p+1) for i in range(10**w)}
l = len(pi)
# Je cherche toutes les séquences de 2 à p chiffres.
# j'accumule les positions de début de ces séquence.
for i in range(l):
    for w in range(2, p+1):
        if i <= l-w: D[pi[i:i+w]].append(i)
# Je ne garde que les positions valides.
# La distance doit être au moins la longueur de la séquence.
for k, L in D.items():
    s=len(L)
    c = 0
    if s > 0:
        w = len(k)
        pv = L[0]   # La première position est ttoujours valide
        c = 1   # On compte les occurences valides
        for i in range(1, s):
            if L[i] - pv >= w:
                pv = L[i]
                c += 1
    D[k] = c   # Le dictionnaire contiendra les fréquences au lieu des listes de positions.
print(round(perf_counter()-begin, 3), "secondes")
# J'affiche la séquence la plus fréquente.
print(max([(k,v) for k,v in D.items()], key=lambda t: t[1]))

1
yg_be Messages postés 22916 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 juillet 2024 1 481
25 déc. 2022 à 10:34

L'énoncé de l'exercice est publié dans une image postée au départ.

Le demandeur a maladroitement résumé cet énoncé.

0

Merci pour votre réponse, mais il faut que j'utilise un fichier .txt contenant 130 000 décimales de pi comment puis-je faire pour le transformer en liste puis faire tous les calculs demandés ?

0
PierrotLeFou
26 déc. 2022 à 15:19

Il faudrait sans doute regarder les fonctions relatives aux fichiers telles que open() et read() et replace() pour faire sauter les fin de ligne ('\n').
Je pense que c'est mieux de travailler avec une chaîne plutôt qu'une liste.

1
Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 916
26 déc. 2022 à 15:42

Bonjour Pierrot, comme te l'as précisé yg_be l.énoncé est posté en image.

Si tu n'as pas d'outil te permettant "d'entendre" ce qui y est écrit, ce n'est pas la peine d'intervenir.

Il y est clairement indiqué que le fichier doit être découpé en liste.

-1
leodmca > Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024
26 déc. 2022 à 18:44

désolé, je ne savais pas, c'est mon premier poste sur ce site, sachant que j'ai posté l'image mais j'ai aussi expliquer en message

0
PierrotLeFou
26 déc. 2022 à 15:49

@Whismeril: es-tu un modérateur? Je pensais que les images n'étaient pas tolérées pour décrire les énoncés ou donner le code ou les erreurs.
Ceci dit, le fait d'utiliser une liste plutôt qu'une chaîne ne devrait rien changer à l'algorithme lui-même.

1
Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 916
26 déc. 2022 à 19:07

Non je ne suis plus modérateur. J'ai "démissionné" ce n'est pas fait pour moi. Je suis "juste" contributeur.

Par contre, j'ai répondu en envoyant le lien vers les règles du forum quand il s'agit d'un exercice.

C'est toi qui ensuite t'es lancé dans des supputations hors sujet, et qui continue bien qu.yg_be (qui est contributeur aussi) t'ai averti.

L'énoncé décrit précisément les étapes que  leodmca doit suivre, les longueurs des séquences et le code à appliquer pour le calcul des fréquences d'occurence.

Manifestement il coince dès la lecture du fichier, c'est donc qu'il n'a pas compris ou suffisamment travaillé ses cours précédents.

Il doit donc commencer par les réviser.

0
yg_be Messages postés 22916 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 juillet 2024 1 481
26 déc. 2022 à 22:53

Pierre, les images ne sont pas interdites.  Celui qui veut se faire aider est invité à communiquer au mieux.  Nous demandons fréquemment d'utiliser du texte plutôt que des images, de façon à pouvoir réutiliser le texte pour tester, pour faire des recherches, ou pour rédiger des réponses.

Celui qui ne fait pas cet effort sera, souvent, moins bien aidé.

0

Essai de checker ici

https://i7code.fr/index.php/2022/12/26/notions-intermediaires-python/

0
Whismeril Messages postés 19084 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 juin 2024 916
27 déc. 2022 à 08:51

complémentèrent nulle cette page, y.a un condensé de tout et n'importe quoi.

pour ceux qui savent programmer ça peut faire office de "résumé", mais pour ceux qui doivent apprendre c'est incompréhensible.

0