Tableau de Karnaugh en Python

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » mer. 27 juil. 2022 23:15

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)

Image

Ce qui donne dans le tableau de Karnaugh .
Image

Oups , j'avais les variables D et E permutées .
Image

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 


MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » jeu. 28 juil. 2022 14:36

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 ! :P

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
>>> 
Image

Image

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)

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » lun. 1 août 2022 11:30

Bonjour ,

Voici donc mon programme de la fonction karnaugh (et sans générer de tableaux) :P .

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 .

Code : Tout sélectionner

table = [1,0,0, etc ,1,0 ]
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 


>>> 
Fichiers joints
karnaugh_python.png
karnaugh_python.png (147.1 Kio) Vu 2063 fois

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » lun. 1 août 2022 21:45

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 ! " :lol:

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » lun. 1 août 2022 22:19

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 .

Code : Tout sélectionner

>>> A=2**0
>>> B=2**1
>>> C=2**2
>>> D=2**3
>>> R=[0] * 2**4
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

Code : Tout sélectionner

    _ _     _     _   _       _
R = B.D + A.C + C.D + C.D + A.B
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]
>>>
Modifié en dernier par MSG le lun. 1 août 2022 22:34, modifié 1 fois.

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » lun. 1 août 2022 22:33

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 .

Code : Tout sélectionner

_           _       _   _ _
R = B.C.D + A.C.D + A.B.C.D

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » mar. 2 août 2022 14:48

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 


>>>
Fichiers joints
karnaugh_python2.png
karnaugh_python2.png (190.37 Kio) Vu 2031 fois

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » mar. 2 août 2022 20:50

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" .
Fichiers joints
karnaugh_python3.png
karnaugh_python3.png (194.43 Kio) Vu 2023 fois

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: Tableau de Karnaugh en Python

Message par Artemus24 » sam. 20 août 2022 15:31

Salut MSG.

Beau travail ! :D

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.
@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: Tableau de Karnaugh en Python

Message par MSG » sam. 20 août 2022 21:05

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 .

Répondre

Retourner vers « Python »