Python, généalogie et SOSA

Je ne suis pas passionné de généalogie, mais je m’intéresse à la façon de numéroter ses ancêtres (Le côté mathématique de la chose).

Ainsi à la trentième génération vous avez plus de cinq cents millions d’aïeuls !

Les généalogistes utilisent pour leur associer un code différents à chacun, la méthode SOSA :

La personne dont on dresse l’ascendance porte le numéro 1.
Son père porte le numéro 2 et sa mère le numéro 3.
Ainsi on associe toujours au père le double du code de l’enfant, et à la mère le code du père augmenté de 1.

Diagramme1

Ainsi à part la première personne qui peut-être un homme ou une femme, chaque individu de code pair est un homme et chaque individu de code impair est une femme.

Le problème c’est qu’un nombre est peu parlant. Qui est l’ancêtre numéro 54 ?

J’ai développé une petite application en Python qui nous en dit plus :

sosa

Cette application vous permet de trouver également le code SOSA du père de la mère du grand-père d’un individu :

sosa2

Ce programme vous intéresse ? Voici le code :


# -*- coding: UTF-8 -*-
digit=('m','p','M','P')
nombre="0123456789"

def retourne (chaine):
 "retourne une chaine de caractère"
 envers=""
 for i in chaine:
 envers =i + envers
 return envers

def sosa(chaine):
 "Donne le sosa, d'une chaine (exemple PMP)"
 valeur=1
 generation=0
 for lettre in retourne(chaine):
 if lettre in ('p','P'):
 valeur=valeur*2
 generation +=1
 elif lettre in ('m','M'):
 generation +=1
 valeur=valeur*2+1
 return valeur, generation

def chaine(sosa):
 "Donne le chaine correspondant au code sosa"
 chaine=""
 generation=0
 while sosa<>1:
 if sosa%2 ==0 :
 chaine += "P"
 generation += 1
 else :
 chaine +=  "M"
 generation +=1
 sosa=sosa/2
 if chaine<>"":
 if chaine[0] in ('p','P'):
 francais=u" Le père "

 elif chaine[0] in ('m','M'):
 francais=u" La mère "

 for i in chaine[1:]:
 if i in ('p','P') : francais = francais + u"du père "
 elif i in ("m",'M') : francais = francais + u"de la mère "
 francais += u"de l'individu"
 else:
 francais=u"L'individu lui même"

 return francais, chaine, generation

a=""
while a<>"q" :
 print u" Entrez au clavier un code SOSA"
 print u" une chaîne de caractère de la forme PPM,"
 print u" pour le père du père de la mère par exemple... )"
 print u"(Q pour quitter)"
 a= raw_input("------------------------> ")
 if a not in ("q","Q",""):
 est_nombre=True
 est_digit=True
 for i in a:
 if i not in digit : est_digit=False
 if i not in nombre :est_nombre=False
 if est_digit :
 x,y=sosa(a)
 print "Code SOSA : " ,x
 print 20*"_"
 print u"Génération : ",y
 print 50*"_"
 if est_nombre and long(a)>0:
 x,y,z= chaine(long(a))
 print u"Décodage SOSA : "
 print x," (",y,")"
 print 20*"_"
 print
 print u"Génération :",z
 print 50*"_"
 print 3*"\n"