Fausse génération de Pi

Discutez d'informatique ici !
fallency
Messages: 8
Enregistré le: 26 Juin 2016, 00:14

Fausse génération de Pi

par fallency » 27 Juil 2022, 12:04

Bonjour à tous,

Voilà, j'ai un soucis assez tordu, que je pose là comme une énigme ou un défi:

J'aimerais créer un livre avec que des fausses décimales de Pi dedans, quel intérêt ? Pour vous, aucun, mais pour moi il y en a un :twisted: , en effet un tel livre pourrais me permettre de, disons le : faire du " mentalisme " :frime: .

Bon, voici comment je vois les choses:

    Le livre devra faire 120 pages (nombre pas fixe mais j'aime bien 120)
    Chaque pages sera composées de 10 lignes
    Chaque ligne comptera 8 (ou 10) "décimale de Pi"

Le plus marrant maintenant, il faudrait quand connaissant le n° de page et le n° de ligne je puisse réciter les 8 (ou 10, mais disons 8) décimales qui s'y trouve.

Voici les quelques règles mise en place pour l'instant:
la seed (ou graine): C'est la somme du nombre de la page (21 => 2+1 = 3)
a,b,c,d,e,f,g,h (les 8 chiffres qui compose une ligne)

[Page 21 ; ligne 4]
pour a&b: ligne + seed (si < 10 on rajoute le 0 devant le chiffre: (21 => 2+1 = 3 +4 =7 => 07 )
pour c&d: seed*2 + chiffre précédant ((3*2)+7 = 13 =>1+3 => 4)
pour e&f: ligne*2 + chiffre précédent ((4*2)+1 = 9)
pour g&h: j'en sais rien :?:
Ex:
les chiffres de cette ligne serais : 0;7;4;1;0;9;?;?

voici un algo en python qui récapitule tout ça (pour les plus pythoneux d'entre vous):

Code: Tout sélectionner
def create_line(s_seed):
  ligne = 1
  while (ligne <= 10):
    ligne_final = []
    position_nb = 1
    while (position_nb <= 8 ):
      if (position_nb < 3):
        """print(f"position_nb {position_nb}")"""
        tmp_nb = s_seed + ligne
      """else: print ("none")"""
      if (position_nb == 1 and tmp_nb < 10):
        tmp_nb = 0
      if (position_nb >= 3 and position_nb < 5):
        """print(f"position_nb {position_nb}")"""
        tmp_nb = (s_seed * 2) + tmp_nb
      if (position_nb == 3 and tmp_nb < 10):
        tmp_nb = 0
      if (position_nb >= 5 and position_nb < 7):
        """print(f"position_nb {position_nb}")"""
        tmp_nb = (ligne * 2) + tmp_nb
      if (position_nb == 5 and tmp_nb < 10):
        tmp_nb = 0
      position_nb = position_nb + 1
      if (len(str(tmp_nb)) != 1):
        reduce_nb = lambda x: x and (x%9 or 9)
        tmp_nb = reduce_nb(tmp_nb) 
        """print(f"tmp_nb: {tmp_nb}>9")"""
      """print (f"tmp_nb: {tmp_nb}")"""
      ligne_final.append(tmp_nb)
    print(ligne_final)
    print(f"ligne: {ligne}")
    ligne = ligne + 1
    print (" ")

def add_number():
    for n in range(120):
        print (f"N° de page: {n}")
        seed = [int(a) for a in str(n)]
        """print(seed)"""
        if (sum(seed) > 9):
            seed = [int(a) for a in str(sum(seed))]
        print(f"la seed est : {sum(seed)}")
        s_seed = sum(seed)
        create_line(s_seed)

def add_number_solo(n):
    print (f"N° de page: {n}")
    seed = [int(a) for a in str(n)]
    """print(seed)"""
    if (sum(seed) > 9):
        seed = [int(a) for a in str(sum(seed))]
    print(f"la seed est : {sum(seed)}")
    print (type(seed))
    print(" ")
    s_seed = sum(seed)
    create_line(s_seed)

def start():
    n = input ("page ?:")
    if not n:
        print ("all")
        add_number()
    else:
        print ("solo")
        add_number_solo(n)
start()


Bien que cette suite de chiffres parait aléatoire, on peut quand même voir des pattern évidant même pour un œil non-averti.
voici quelques exemple de lignes générées:

N° de page: 118
la seed est : 1
[0, 2, 0, 2, 0, 2, 2, 2]
ligne: 1

[0, 3, 0, 2, 0, 4, 4, 4]
ligne: 2

[0, 4, 0, 2, 0, 6, 6, 6]
ligne: 3

[0, 5, 0, 2, 1, 9, 9, 9]
ligne: 4

[0, 6, 0, 2, 3, 4, 4, 4]
ligne: 5

[0, 7, 0, 2, 5, 8, 8, 8]
ligne: 6

[0, 8, 1, 3, 8, 4, 4, 4]
ligne: 7

[0, 9, 2, 4, 2, 9, 9, 9]
ligne: 8

[1, 1, 0, 2, 2, 2, 2, 2]
ligne: 9

[2, 2, 0, 2, 4, 6, 6, 6]
ligne: 10



et donc après cette longue introduction, voici le challenge:

    Comment générer une suite de x chiffres à partir d'un nombre et d'un chiffre et surtout sans pattern évidant d'une ligne à l'autre.
    Les calculs doivent pouvoir être fait de tête (pas de (44 modulo 14 - le nombre d'or), je vous vois venir :hehe: )

Pour ce défis vous pouvez complètement oublier tout le protocole précédent.

Voilà j'espère que c'est assez clair
Dans tous les cas merci d'avoir lu ce pavé.

Bonne journée à toutes et tous. :super:
Modifié en dernier par fallency le 08 Aoû 2022, 10:17, modifié 1 fois.



Saiga
Membre Naturel
Messages: 21
Enregistré le: 16 Juil 2021, 16:27

Re: FAUSSE GÉNÉRATION DE PI

par Saiga » 02 Aoû 2022, 14:03

Je résume l'énoncé du problème, qui est un peu confus :
- tu veux faire croire à tes amis que tu as appris les 9 600 (ou 12 000) premières décimales de pi
- en réalité tu n'as pas envie d'apprendre les 9 600 (ou 12 000) premières décimales de pi

Ce dont tu as besoin c'est d'un générateur de nombres pseudo-aléatoires qui a les caractéristiques suivantes :
- La graine (=nombre de départ du générateur) est un nombre obtenu à partir du numéro de page et du numéro de ligne
- L'algorithme doit être suffisamment robuste pour qu'il n'y ait pas de biais évidents au premier regard (contrairement au tient).
- L'algorithme doit être suffisamment simple pour que les calculs puissent être faits de tête.

Une première idée (qui mérite d'être améliorée) : utiliser un algorithme de van Neumann pour des nombres à deux chiffres. Par exemple :
- graine = ( numéro de page + numéro de ligne ) modulo 100.
- calculer le carré de la graine. Ajouter des 0 devant si nécessaire pour obtenir un nombre à 4 chiffres.
- nombre généré = les deux chiffres du milieu
- nouvelle graine = nombre généré

Avec page 38, ligne 6, on obtient :
- graine = 44.
- 44*44 = 1936 donc le premier nombre est 93.
- en répétant, on obtient suite de nombres = 93, 64, 09, 08


Avantage :
- Il suffit de connaître ou de savoir calculer rapidement les 100 premiers carrés (toujours mieux que d'apprendre plusieurs milliers de chiffres par coeur).

Inconvénients :
- Avec mon calcul de graine, la page 101 a les mêmes graines que la page 1, la page 102 a les mêmes graines que la page 2, etc. Ces pages ont donc aussi les mêmes suites de chiffres. Quelqu'un d'un peu observateur pourrait s'en rendre compte. Cela dit, le calcul de la graine peut être amélioré.
- Quand la graine (ou dans une moindre mesure un des nombres générés) est inférieur à 10, on a beaucoup de 0. Là encore ça peut être amélioré.
- La plupart des gens connaissent les premières décimales de pi, certains en connaissent même plusieurs dizaines. Il faudrait que dans les x premières pages (x à déterminer), il y ait les vraies décimales de pi (et donc que tu les apprenne).

fallency
Messages: 8
Enregistré le: 26 Juin 2016, 00:14

Re: Fausse génération de Pi

par fallency » 08 Aoû 2022, 10:42

Salut et merci pour ta réponse.

utiliser un algorithme de van Neumann


Bien vu, je ne connaissais pas cette algorithme, le carré c'est pas ce qu'il y a de plus simple à calculer, mais ça devrait le faire.

Avantage :
- Il suffit de connaître ou de savoir calculer rapidement les 100 premiers carrés (toujours mieux que d'apprendre plusieurs milliers de chiffres par coeur).


Pour ça 4 méthodes:

Code: Tout sélectionner
si n finis par 0 : n0 -> (n*n) *100
   ex: 40 -> (4*4)*100 = 1600

si n finis par 5: ab avec b=5 et 1 < a <9
   ((a * (a+1)) *100)+ 25
   ex: 35 -> ((3*4)*100)+25 = 1225

si 40 < n < 60:  e = l'écart avec 50 ;    ((n-25)*100)+e^2
   ex: 44 -> e = 50-44 = 6
        ((44-25)*100) + 6^2
        (19*100) +36
        1936

sinon, il y a une méthode assez longue à faire, qu'on peut trouver sur Youtube pour calculer le carré de n'importe quel nombre. 


Dans tous les cas, il y a 41% de chance de tomber sur un nombre ou chiffre qui correspond aux trois premiers cas et 59% de tomber sur le dernier.

- Avec mon calcul de graine, la page 101 a les mêmes graines que la page 1


Deux solutions, soit on réduit le nombre de pages, soit on fait en sorte qu'il ne choisisse pas les dernières pages, à méditer de mon coté

- Quand la graine (ou dans une moindre mesure un des nombres générés) est inférieur à 10, on a beaucoup de 0. Là encore ça peut être amélioré.


La beauté du nombre PI c'est que tout peut arriver, même plusieurs 0 de suite.

- La plupart des gens connaissent les premières décimales de pi, certains en connaissent même plusieurs dizaines. Il faudrait que dans les x premières pages (x à déterminer), il y ait les vraies décimales de pi (et donc que tu les apprenne).


Là encore on peut gruger un peu en écartant les fans de PI en utilisant leurs égos, je suis sur quand disant "PI, 3,1415926535" et en demandant si quelqu'un connait la suite, il ne se priveront pas de répondre.

Dans tous les cas, merci pour la réponse, et n'hésite pas si tu as d'autres idées.

reste plus qu'a écrire du code pour générer tout ça :frime: .

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite