Beauté modulaire des tables de multiplication

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Beauté modulaire des tables de multiplication

Message par falsam »

Le principe de l'arithmétique modulaire est de travailler non sur les nombres eux-mêmes, mais sur les restes de leur division par quelque chose.

La fonction PureBasic Mod() retourne le Reste de la division d'un Nombre par son Diviseur

■ Considérons la table de 3 modulo 10
3 × 1 = 3 => 3 × 1 = 3 (mod. 10) Debug Mod(3, 10) = 3
3 × 2 = 6 => 3 × 2 = 6 (mod. 10) Debug Mod(6, 10) = 6
3 × 3 = 9 => 3 × 3 = 9 (mod. 10) Debug Mod(9, 10) = 9
3 × 4 = 12 => 3 × 4 = 2 (mod. 10) Debug Mod(12, 10) = 2
3 × 5 = 15 => 3 × 5 = 5 (mod. 10) Debug Mod(15, 10) = 5
Etc ....

Le code que je vous présente va vous permettre de voir graphiquement ce que ça donne.

Essayez par exemple d'afficher la table de 30 modulo 87 (Avec 87 points) et pourquoi pas la table de 464 modulo 691.

La touche Entrée de votre clavier ou le bouton Voir permet de voir le résultat.

Code : Tout sélectionner

; Beauté modulaire des tables de multiplication

; Le principe de l'arithmétique modulaire est de 
; travailler non sur les nombres eux-mêmes, mais 
; sur les restes de leur division par quelque chose.

; La fonction PureBasic Mod() retourne le reste de la division d'un 'Nombre' par son 'Diviseur 

; Considérons la table de 3 modulo 10
; 3 × 1 = 3  => 3 × 1 = 3 (mod. 10) Debug Mod(3, 10)  = 3
; 3 × 2 = 6  => 3 × 2 = 6 (mod. 10) Debug Mod(6, 10)  = 6
; 3 × 3 = 9  => 3 × 3 = 9 (mod. 10) Debug Mod(9, 10)  = 9
; 3 × 4 = 12 => 3 × 4 = 2 (mod. 10) Debug Mod(12, 10) = 2
; 3 × 5 = 15 => 3 × 5 = 5 (mod. 10) Debug Mod(15, 10) = 5
; Etc ....

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration gadget
  #mfResult
  #mfTable
  #mfModulo
  #mfShowCircle
  #mfShowPoint
  #mfView
EndEnumeration

Enumeration shortcut
  #Return
EndEnumeration

; Font d'affichage des nombres
Global Font = LoadFont(#PB_Any, "", 10)

; Structure d'un point (Compatibilité Mac OS)
Structure NewPoint
  x.i
  y.i
EndStructure

; Sommaire
Declare Start()
Declare ViewResult()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(#mf,  0,  0, 1024, 768, "Beauté modulaire des tables de multiplication", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  AddKeyboardShortcut(#mf, #PB_Shortcut_Return, #Return) 
                      
  ; Affichage du résultat
  CanvasGadget(#mfResult, 0, 0, 1024, 700)   
  
  TextGadget(#PB_Any, 10, 710, 80, 24, "Table de multiplication")
  StringGadget(#mfTable, 90, 710, 50, 24, "2", #PB_String_Numeric)
  
  TextGadget(#PB_Any, 180, 710, 80, 24, "Nombre de points")
  StringGadget(#mfModulo, 260, 710, 50, 24, "10", #PB_String_Numeric)
  
  CheckBoxGadget(#mfShowCircle, 340, 710, 100, 24, "Dessiner le cercle")
  SetGadgetState(#mfShowCircle, #True)
  
  CheckBoxGadget(#mfShowPoint, 460, 710, 100, 24, "Voir les points")
  SetGadgetState(#mfShowPoint, #True)
  
  ButtonGadget(#mfView, 930, 710, 80, 24, "Voir")
  SetActiveGadget(#mfModulo)
  
  ViewResult()
  
  ; Déclencheur
  BindGadgetEvent(#mfView, @ViewResult())
  BindEvent(#PB_Event_Menu, @ViewResult(), #mf, #Return)
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent(10) : ForEver
EndProcedure

Procedure ViewResult()
  
  ; Centre du cercle & Rayon
  Protected CX = GadgetWidth(#mfResult)/2
  Protected CY = GadgetHeight(#mfResult)/2
  Protected Radius 
  
  ; Afficher le cercle Oui ou Non
  Protected ShowCircle.b = GetGadgetState(#mfShowCircle)
    
  ; Nombre de points sur le cercle
  Protected Modulo = Val(GetGadgetText(#mfModulo))
  
  ; Point, Angle et position X, Y de chaque point
  Protected P, Angle.f, X, Y
  
  ; Table de multiplication à utiliser
  Protected Table = Val(GetGadgetText(#mfTable))
    
  ; Affichage des points 
  Protected ShowPoint.b = GetGadgetState(#mfShowPoint)
  
  ; Affichage des lignes 
  Protected X0, Y0, X1, Y1
    
  ; Mémorisation des points
  Protected NewMap Points.NewPoint()
  
  ; Le nombre de points doit être supérieur à 0
  If Modulo < 1
    SetGadgetText(#mfModulo, "1")
    Modulo = 1
  EndIf
  
  Angle = -90
  
  If StartDrawing(CanvasOutput(#mfResult))
    ; Clear Canvas
    Box(0, 0, 1024, 700, RGB(210, 180, 140))
    
    ; Affichage du cercle
    Radius = 300
    If ShowCircle
      DrawingMode(#PB_2DDrawing_Outlined)
      Circle(CX, CY, Radius, RGB(0, 0, 0))
    EndIf
    
    ; Calcul et affichage des coordonnées de chaque point sur le cercle
    While Angle < 270
      Radius = 300
      
      ; Mémorisation des coordonnées X, Y de chaque point
      X = CX + Radius * Cos(Angle * #PI / 180)
      Y = CY + Radius * Sin(Angle * #PI / 180)      
      
      AddMapElement(Points(), Str(P))
      Points()\x = X
      Points()\y = Y
      
      ; Affichage de chaque point sur le cercle
      If ShowPoint 
        Circle(X, Y, 1, RGB(0, 0, 0))
        
        Radius = 320
        X = CX + Radius * Cos(Angle * #PI / 180)
        Y = CY + Radius * Sin(Angle * #PI / 180)    
      
        DrawingFont(FontID(Font))
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Str(P))/2, Y-TextHeight(Str(P))/2, Str(P), RGB(0, 0, 0))  
      EndIf
            
      ; Point suivant
      P + 1
      Angle + 360/Modulo      
    Wend
    
    ; Représentation graphique de la table de multiplication 
    P = 0
    While P < Modulo
      
      ; Recherche des coordonnées X0, Y0 du point 0 puis 1 puis 2 etc ....
      FindMapElement(Points(), Str(P))
      X0 = Points()\x
      Y0 = Points()\y
      
      ; Recherche des coordonnées X1,Y1 du résultat ou du reste de la division 
      FindMapElement(Points(), Str(Mod(P * Table, Modulo)))
      X1 = Points()\x
      Y1 = Points()\y
      
      ; Dessin de la ligne reliant les deux points
      LineXY(X0, y0, x1, y1, RGB(0, 0, 0))
      
      ; Point suivant
      P + 1
    Wend
    
    StopDrawing()
  EndIf
EndProcedure

Procedure Exit()
  End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: Beauté modulaire des tables de multiplication

Message par Mindphazer »

Salut Falsam

C'est sympa ton truc, j'aime bien...

Pour ceux qui veulent en savoir plus sur l'arithmétique modulaire (et comprendre un peu mieux le pourquoi - comment de ton programme), ils peuvent jeter un oeil ici :
https://www.mathemathieu.fr/art/article ... plications
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Beauté modulaire des tables de multiplication

Message par venom »

8O Ouah pas mal... Je ne connais pas du tout l'arithmétique modulaire, mais le code est sympa. ça mérite réflexion.
Merci du partage falsam. 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Beauté modulaire des tables de multiplication

Message par Naheulf »

Moi ça m'as fait repenser à cette vidéo d Micmaths : https://www.youtube.com/watch?v=-X49VQgi86E
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Beauté modulaire des tables de multiplication

Message par Ollivier »

@Naheulf

Ça fait 22 ans que j'ai programmé un truc comme celui de Youtube. C'était sur un 80386 qui m'a été volé. Ça me semblait très grave de me faire voler (surtout en 2013 !! Un 80386 à 33 MHz ça ne vaut rien...). Et j'avoue que cette ancienneté que je ne peux hélas pas prouver simplement m'indique que falsam a sûrement trouvé cette "beauté", tout seul, par le plus beau des hasards !

@Tous

Ce serait intéressant de trouver un site ou un clip youtube ou autre pour ceci. Je remercierais la personne qui pourrait m'éclaircir à ce sujet.

C'est un sujet "cousin" à ce sujet-ci. Au lieu de moduler un reste de division, on module simplement un nombre premier. Et au lieu de le moduler avec n'importe quel nombre,on le module simplement par 10.

L'équation logique (inscrite dans le sujet en lien sur ce forum) est déconcertante puisqu'elle utilise un centième de milliardième de processeur Intel actuel.

N'hésitez pas à la retrouver quelquepart sur Internet : ça me fera beaucoup plaisir. Je me sentirai moins seul...





PS : (edit) L'équation logique, je la copie ici :

S = (E2 & E0) | (E7 & E5) | (E6 & E4 & E3 & E1)

2 portes OU
5 portes ET
(et 2*5 ça fait 10, je... humour)

Ça permet de construire un nombre entier analogue à Pi ou e, mais... entier, et qui contient tous les nombres premiers que l'on a calculé.

Pour Pi, ça commence par 3.14...etc... jusqu'à l'infini
Pour e, ça commence par 2.7... etc... jusqu'à l'infini
Pour ce nombre que je parle et dont je vous montre la démonstration de calcul, et le code source dans le lien plus haut, ce nombre entier commence par
F5... etc... jusqu'à l'infini en hexadécimal.

On avait e pour Euler.
Vu que ça commence par F en hexa, ça fait une bonne coïncidence avec Fred !

F, le "nombre de Fred", F = 0x0F5...h qui contient strictement tous les nombres premiers et uniquement les nombres premiers dans la limite de ce que l'on a cherché et stocké, avec le process complet ici !! Via sa représentation binaire (1 signifie premier et 0 non premier). Et chaque quartet (chaque chiffre hexa) représente un dizaine scrutée !
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: Beauté modulaire des tables de multiplication

Message par Mindphazer »

Ollivier a écrit : Pour ce nombre que je parle et dont je vous montre la démonstration de calcul, et le code source dans le lien plus haut, ce nombre entier commence par F5... etc... jusqu'à l'infini en hexadécimal.
C'est toujours une grande aventure de lire les proses d'Ollivier, surtout ce genre de phrase !
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Beauté modulaire des tables de multiplication

Message par Ollivier »

@Mindphazer

Pardon :

<<
Pour ce nombre, dont je vous parle, et duquel je vous montre la démonstration de calcul, ainsi que le code source dans le lien plus haut, ce nombre entier commence par F5... etc... jusqu'à l'infini en hexadécimal. >>

J'ajoute :

On peut dire que F5AE5A devrait normalement donner autre chose qu'une couleur orange sur Google puisque ce nombre stocke 15 nombres premiers, sans avoir à les chercher (pgdc, etc...) : 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61 et 67.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Beauté modulaire des tables de multiplication

Message par falsam »

Naheulf a écrit :Moi ça m'as fait repenser à cette vidéo d Micmaths : https://www.youtube.com/watch?v=-X49VQgi86E
C'est cette video qui m'a inspirée :wink:

Olivier tu n'as pas pu t'en empécher hein ? C'est pas grave ...
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Beauté modulaire des tables de multiplication

Message par Ollivier »

falsam a écrit :
Naheulf a écrit :Moi ça m'as fait repenser à cette vidéo d Micmaths : https://www.youtube.com/watch?v=-X49VQgi86E
C'est cette video qui m'a inspirée :wink:

Olivier tu n'as pas pu t'en empécher hein ? C'est pas grave ...
Ah zut, sans lien vers Youtube, je pensais que tu avais trouvé ça au pif.

Vu que tu préviens, j'ai copié mon texte en 2 secondes. Et tu peux, si besoin, nettoyer la page. Quand j'aurai le temps, je complèterai l'autre sujet.

Remarque : l'auteur du clip Youtube met un certain temps avant de parler de "pétale". C'est un peu douteux quand même. M'enfin, en maths, le doute est omniprésent...
Répondre