Page 2 sur 2
Re: Tableau de Karnaugh en Python
Posté : mer. 27 juil. 2022 23:15
par MSG
Et avec deux équations ?
pas A et B
ou
pas C et E
soit bool( i&A!=A and i&B or i&C!=C and i&E)
Ce qui donne dans le tableau de Karnaugh .
Oups , j'avais les variables D et E permutées .
Et le code du début .
Code : Tout sélectionner
# liste des variables
#---------------------
n = 5 # nombre de variables à créer
var_list = ""
for i in range(n):
var_list += chr(97+i)
# table de verité
#------------------
A = 2**0
B = 2**1
C = 2**2
D = 2**3
E = 2**4 # liste à compléter suivant la taille maxi
equation = "A\ & B + C\ & E"
table = [0] * 2**n
for i in range(2**n):
table[i] = int( bool( i&A!=A and i&B or i&C!=C and i&E ))
# Permutations des variables
#------------------------------
# var_list = "abced" # si besoin
Re: Tableau de Karnaugh en Python
Posté : jeu. 28 juil. 2022 14:36
par MSG
On peut aussi filtrer pour ne faire apparaitre que les bits à 0 ou que les bits à 1 , l'équation finale est parfois plus simple lorsque on a moins de bit à localiser .
C'est fou ce que je deviens fainéant !
Code : Tout sélectionner
>>> table = [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0]
>>>
>>> table.count(0)
18
>>> table.count(1)
14
>>>
Code : Tout sélectionner
# affichage du tableau
#----------------------
print ("\nEquation = %s" %equation)
print ("table = %s" %(table))
aff = "\n"
for i in range( len(var_x)-1, -1, -1 ):
aff += "%s%s" %( " "*(len(var_y)), " ." )
for j in range( 1, len( var_x[0] )):
#if j == 0: aff_x += " "
aff += "%s." %var_x[i][j]
aff += "\n"
aff += "%s%s%s\n" %( " ."*len( var_y), " .", " ."*tx )
for i in range( ty ):
for j in range( tx ):
if j==0:
for k in range( len( var_y )-1,-1,-1 ):
aff += "%s." %var_y[k][i+1]
if k == 0: aff += " ."
# aff += "%1s." %(int( table[ t_index[i][j]])) # de vérité
# aff += "%1s." %( table[ t_index[i][j]] and "1" or " ") # 1 uniquement
aff += "%1s." %( table[ t_index[i][j]]^1 and "0" or " ") # 0 uniquement
aff +="\n"
print(aff)
Re: Tableau de Karnaugh en Python
Posté : lun. 1 août 2022 11:30
par MSG
Bonjour ,
Voici donc mon programme de la fonction karnaugh (et sans générer de tableaux)
.
Pour l'utiliser , il faut bien évidemment générer une table de vérité .
Ex : avec une suite de 0 et 1 correspondant au résultat sortant correspondant à l'état des bits d'entrée .
Que vous pourrez afficher avec le code suivant :
Code : Tout sélectionner
for i in range( len( table )):
if i<1: print (" HGFEDCBA = S")
print ("%3i %08i = %s" %( i, int(bin(i)[2:]), table[i] ))
Exemple d'affichage d'une table que j'ai généré :
Code : Tout sélectionner
>>> for i in range( len( table )):
... if i<1: print (" HGFEDCBA = S")
... print ("%3i %08i = %s" %( i, int(bin(i)[2:]), table[i] ))
...
HGFEDCBA = S
0 00000000 = 1
1 00000001 = 1
2 00000010 = 0
3 00000011 = 1
4 00000100 = 1
5 00000101 = 1
6 00000110 = 1
7 00000111 = 1
8 00001000 = 1
9 00001001 = 1
10 00001010 = 1
11 00001011 = 1
12 00001100 = 0
13 00001101 = 1
14 00001110 = 0
15 00001111 = 0
>>>
Ce qui donne le résultat suivant une fois la fonction karnaugh déclarée :
Code : Tout sélectionner
>>> karnaugh(table)
Table : [1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
Total à 1 : 12
Total à 0 : 4
. . .C.C.
. . .A.A. .
. .1.1.1.1.
.B.0.1.1.1.
D.B.1.1.0.0.
D. .1.1.1.0.
0 1 5 4
2 3 7 6
10 11 15 14
8 9 13 12
>>>
Re: Tableau de Karnaugh en Python
Posté : lun. 1 août 2022 21:45
par MSG
Bon , ce n'est pas conventionnel , car la variable
A devrait se trouver tout à gauche (au MSB) et la dernière tout à droite (au LSB) .mais ça oblige à chaque taille de tableau de changer le poids des variables . De ma façon , les variables gardent toujours la même place dans la table de vérité et les valeurs sont de toutes façon placées au bon endroit .
Peut importe la méthode , l'important c'est que ça fonctionne !
Comme disait Jean-Pierre de Coubertin , le cousin de l'autre , "
Celui qui n'a partipicer . ne peut pas gagner ! "
Re: Tableau de Karnaugh en Python
Posté : lun. 1 août 2022 22:19
par MSG
Je vais vous prouver que ça fonctionne !
Un table au hazard sur laquelle je chercher l'équation des bits à 1 .
Code : Tout sélectionner
>>> karnaugh(table, s=1)
Table : [1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
Total à 1 : 12
Total à 0 : 4
. . .C.C.
. . .A.A. .
. .1.1.1.1.
.B. .1.1.1.
D.B.1.1. . .
D. .1.1.1. .
0 1 5 4
2 3 7 6
10 11 15 14
8 9 13 12
>>>
Pour vérifier , je déclare mes variables .
puis je créer un code qui va me vérifier les équations .
Code : Tout sélectionner
>>> for i in range( len( table )):
... R[i] = int( bool( \
... i&B^B and i&D^D or \
... i&A and i&C^C or \
... i&C and i&D^D or \
... i&C^C and i&D or \
... i&A and i&B^B ))
...
>>>
Soit l'équation
Le résultat :
Code : Tout sélectionner
>>> R
[1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
>>> table
[1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
>>>
Re: Tableau de Karnaugh en Python
Posté : lun. 1 août 2022 22:33
par MSG
La même table mais en cherchant l'équation des 0 .
Code : Tout sélectionner
>>> karnaugh(table, s=0)
Table : [1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
Total à 1 : 12
Total à 0 : 4
. . .C.C.
. . .A.A. .
. . . . . .
.B.0. . . .
D.B. . .0.0.
D. . . . .0.
0 1 5 4
2 3 7 6
10 11 15 14
8 9 13 12
la vérification en prenant soin d'effacer la table des résultats R .
Code : Tout sélectionner
>>> R=[0] * 2**4
>>> R
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> for i in range( len( table )):
... R[i] = int( bool( \
... i&B and i&C and i&D or \
... i&A^A and i&C and i&D or \
... i&A^A and i&B and i&C^C and i&D^D )^1)
...
>>> R
[1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
>>> table
[1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
>>>
Ce qui nous donne l'équation .
Re: Tableau de Karnaugh en Python
Posté : mar. 2 août 2022 14:48
par MSG
Quelques bugs corrigés , surtout la gestion des variables et ajout de l'affichage de la table de vérité .
Ce qui donne le résultat suivant :
Code : Tout sélectionner
>>> karnaugh(table)
Table
HGFEDCBA = S
0 00000000 = 1
1 00000001 = 1
2 00000010 = 1
3 00000011 = 1
4 00000100 = 1
5 00000101 = 0
6 00000110 = 0
7 00000111 = 1
8 00001000 = 1
9 00001001 = 1
10 00001010 = 1
11 00001011 = 0
12 00001100 = 0
13 00001101 = 1
14 00001110 = 0
15 00001111 = 0
Total à 1 : 10
Total à 0 : 6
. . .C.C.
. . .A.A. .
. .1.1.0.1.
.B.1.1.1.0.
D.B.1.0.0.0.
D. .1.1.1.0.
0 1 5 4
2 3 7 6
10 11 15 14
8 9 13 12
>>>
Re: Tableau de Karnaugh en Python
Posté : mar. 2 août 2022 20:50
par MSG
Voici la version du programme , comme on l'enseigne en formation avec la variable
A à gauche (sur MSB) .
Ce qui donne le résultat suivant :
Code : Tout sélectionner
>>> karnaugh(table)
Table
ABCD = S
0 0000 = 1
1 0001 = 1
2 0010 = 1
3 0011 = 1
4 0100 = 1
5 0101 = 0
6 0110 = 0
7 0111 = 1
8 1000 = 1
9 1001 = 1
10 1010 = 1
11 1011 = 0
12 1100 = 0
13 1101 = 1
14 1110 = 0
15 1111 = 0
Total à 1 : 10
Total à 0 : 6
. . .C.C.
. . .D.D. .
. .1.1.1.1.
.B.1.0.1.0.
A.B.0.1.0.0.
A. .1.1.0.1.
0 1 3 2
4 5 7 6
12 13 15 14
8 9 11 10
>>>
Le remplissage du tableau se fait facilement , ligne par ligne . L'inconvénient à l'usage , c'est qu'il faut recalculer le poids de toutes les variables si l'on change de tableau . Avec celui que j'utilise avec le A à droite (au LSB) , A=1 , B=2 , C=4 , D=8 , etc , on n'a pas à les recalculer si l'on change de taille de tableau et le remplissage se fait en Z "miroir" .
Re: Tableau de Karnaugh en Python
Posté : sam. 20 août 2022 15:31
par Artemus24
Salut MSG.
Beau travail !
Evite de mettre des images car si quelqu'un désire récupérer ton code, il préfère le copier/coller alors que dans ce cas, il doit tout retaper à la main avec source d'erreur.
Quel est le but de ce programme ? As-tu un besoin de travailler avec les tableaux de Karnaugh ?
Cordialement.
Artemus24.
@+
Re: Tableau de Karnaugh en Python
Posté : sam. 20 août 2022 21:05
par MSG
Bonsoir ,
Si je l'ai mis en image , c'est bien pour une raison . Ça fait partie de l'apprentissage de la programmation . Moi même , j'ai appris en tapant ce bout de programme , des petites erreurs (oublis de parenthèses et autres espace d'indentation) , ce qui m'oblige à utiliser de bonnes pratiques et être méthodique . Mais surtout trouver la source de l'erreur , car l'interpréteur python à tendance à reporter l'erreur sur la ligne suivante , voir plus loin dans le programme (valeurs hors limite).
Si vous le voulez , je vous le mettrais en listing .
En fait , j'avais fait un tableau de Karnaugh sur tableur pour résoudre un problème , il y a bien longtemps . Je ne vous dis pas la taille des formules longues comme le(s) bras dans chaque case et sur plusieurs feuilles .Et là , j'ai voulu le coder en Python par défit personnel .
Perso , je n'en ai pas une utilité régulière , mais sur certains problèmes , comme à l'époque avec un problème de portes logiques , ça aide bien .