Pour rappel, on peut situer les nombres premiers > 5 dans 4 classes de nombres caractérisés par leur dernier chiffre :
- ceux qui finissent par 1
- ceux... par 3
- ceux... par 7
- ceux .. par 9
Dans un dizaine quelconque >= 10, on a donc un quartet qui se forme en fonction de l'état premier ou non premier des 4 nombres finissant par 1, 3, 7 ou 9.
Exemple :
entre 10 et 20
on a 11, 13, 17 et 19.
Ils sont tous premiers donc on obtient le nombre 1111 en base 2, 15 en base 10 ou encore F en base 16.
On convient que l'ordre des bits suit le sens de la lecture de gauche à droite.
Exemple, entre 20 et 30, on a 23 et 29 qui sont premiers et 21 et 27 sont non premiers. Donc
21, (23), 27 et (29) ce qui fait 0101 base 2 donc le code 5 en base 10 (ou 16).
On décide de représenter ces codes par des points dans une surface de 16*16. Ceci en alternant, d'une dizaine à la suivante, x et y.
Exemple de 10 à 30, on a 2 dizaines successives qui donnent 2 codes : F et 5.
On va donc dessiner le point d'abscisse F (15) et d'ordonnée 5.
On observe une figure qui se dessine à gauche dans le code suivant. J'ai représenté l'équation logique équivalente à droite.
On constate une équation logique "plutôt" simple :
S = E2&E0 | E7&E5 | E6&E4&E3&E1
avec 8 entrées de 0 à 7
de 0 à 3 pour les abscisses
de 4 à 7 pour les ordonnées
Comme le carré de 16*16 n'est pas également réparti, ça offre 1 cause et un effet :
1) Vérifier si ce carré se complète (ça permet aussi de comprendre que cette facilité est, quelque part, une sorte de "piège" de recherche de primalité.
2) Obtenir des consignes spécifiques de compression de données avec chaque position inutilisées.
Aussi l'équation logique est, quelque part, très simple. Elle se passe d'ordinateur (pollution, esclavage), de système d'exploitation (débat du libre/breveté), de logiciel d'exécution et de beaucoup d'électricité pour le calcul. Cependant, je suis dégelasse car je vais quand même me passionner d'utiliser les SIMD avec PureBasic sur un ordi, vu son âge, l'impact négatif reste relatif.
Code : Tout sélectionner
Procedure.i pn(n)
Define Sq = Sqr(N)
For i = 2 To Sq
If (N % I) = 0
ProcedureReturn 0
EndIf
Next
ProcedureReturn 1
EndProcedure
Procedure.I DC(D) ; (D)ecade (C)ode
L1 = D + 1
L3 = D + 3
L7 = D + 7
L9 = D + 9
ProcedureReturn PN(L1) << 3 + PN(L3) << 2 + PN(L7) << 1 + PN(L9)
EndProcedure
Structure PointP
X.I
Y.I
EndStructure
Procedure.I PC(*R.PointP, V) ; (P)oint (C)ode
Define *R.PointP
*R\X = DC(V)
*R\Y = DC(V + 10)
EndProcedure
Procedure Surface16x16()
Define Win = OpenWindow(#PB_Any, 0, 0, 512, 256, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Define *P.PointP = AllocateMemory(SizeOf(PointP) )
Define N = 10
Define G = 255
StickyWindow(Win, 1)
If StartDrawing(WindowOutput(Win) )
Box(0, 0, 512, 256, RGB(0, 0, 0) )
EndIf
StopDrawing()
Repeat
If StartDrawing(WindowOutput(Win) )
If 0
Else
PC(*P, N)
x = *P\X * 16
y = *P\Y * 16
Box(x, y, 16, 16, RGB(g, g, g) )
EndIf
If 1
Q = 0
For Y = 0 To 15
For X = 0 To 15
E = Q ! $FF
E0 = E >> 0 & 1
E1 = E >> 1 & 1
E2 = E >> 2 & 1
E3 = E >> 3 & 1
E4 = E >> 4 & 1
E5 = E >> 5 & 1
E6 = E >> 6 & 1
E7 = E >> 7 & 1
S = (E2 & E0) | (E7 & E5) | (E6 & E4 & E3 & E1)
If Not S
C = RGB(0, 0, 0)
Else
C = RGB(255, 255, 255)
EndIf
Box(256 + X << 4 + 2, Y << 4 + 2, 12, 12, C)
Q + 1
Next
Next
EndIf
EndIf
StopDrawing()
Delay(2)
Ev = WindowEvent()
N + 20
Until Ev = #PB_Event_CloseWindow
EndProcedure
Surface16x16()