Răsfoiți Sursa

Calcul nombre premier

Arthur Brandao 5 ani în urmă
părinte
comite
d1ed1ae1de

+ 1 - 0
app/main/application-menu.js

@@ -36,6 +36,7 @@ let template = [
         label: 'Calcul nombre premier',
         click: () => {
           console.log('prime-number');
+          demo.primeNumber();
         }
       },
       {

+ 24 - 1
app/main/function/demo-application-menu.js

@@ -1,13 +1,36 @@
+const {ipcMain} = require('electron');
+const path = require('path');
 const tray = require('./tray');
 const notif = require('./notif');
+const dialog = require('./dialog');
+const window = require('../../../helper/window');
 const demoMenu = {};
 
+let hiddenWindow = null;
+
 demoMenu.primeNumberPopup = function () {
 
 };
 
 demoMenu.primeNumber = function () {
-
+    // Only one calc at the same time
+    if (hiddenWindow) {
+        return;
+    }
+    //const number = 409291;
+    const number = 12000000003;
+    // Wait prime number is calculated
+    ipcMain.once('prime-number-result', (event, result) => {
+        let message = `Le nombre ${number} ` + (result ? 'est premier' : 'n\'est pas premier'); 
+        dialog.message('Résultat du test de primalité', message);
+        hiddenWindow.close();
+    });
+    //Create hidden window to calc prime number
+    hiddenWindow = window.hidden(path.join(__dirname, '../../renderer/page/prime-number/prime-number.html'));
+    // Send number to test when window is ready
+    hiddenWindow.on('ready-to-show', () => {
+        hiddenWindow.webContents.send('calc-prime-number', number);
+    });
 };
 
 demoMenu.primeNumberResult = function () {

+ 15 - 0
app/renderer/page/prime-number/prime-number.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="UTF-8">
+        <title>Electronotes</title>
+    </head>
+    <body>
+        <!-- Pour prendre du temps mettre un nombre dans les 10 000 000 000-->
+        
+        <!-- Load only electronotes.js this page is hidden -->
+        <script type="text/javascript" src="../../common/js/electronotes.js"></script>
+        <!-- Load personnal js -->
+        <script type="text/javascript" src="prime-number.js"></script>
+    </body>
+</html>

+ 66 - 0
app/renderer/page/prime-number/prime-number.js

@@ -0,0 +1,66 @@
+// Wait event to calc prime number
+ipcRenderer.once('calc-prime-number', (event, number) => {
+    const result = primalite(number);
+    ipcRenderer.send('prime-number-result', result);
+});
+
+function primalite (nombre) {
+    // Calcul de la racine carré du nombre a tester
+    const sqrt = Math.ceil(Math.sqrt(nombre));
+    // Recupération des nombres premiers inferieur à la racine
+    const primeNumber = eratosthene(sqrt);
+    // Test si le nombre est divisible par les nombres premiers
+    for(const prime of primeNumber) {
+        if (nombre % prime === 0) {
+            // Le nombre est divisible et donc pas premier
+            return false;
+        }
+    }
+    // Si on arrive ici le nombre n'est pas divisible et donc premier
+    return true;
+}
+
+function eratosthene (nombre) {
+    const retour = [];
+    const valeur = [];
+    const marqueur = [];
+    let compteur = 0;
+    let mem = 0
+    // Initilisation des tableaux
+    for(let i = 2; i <= nombre; i++) {
+        valeur[i - 2] = i;
+        marqueur[i - 2] = 0;
+    }
+    // Parcours et elimination des nombres
+    for (let i = 0; i <= nombre - 2; i++) {
+        // Regarde si le nombre n'est pas déjà marqué
+        if (marqueur[i] === 0) {
+            // On marque tous les nombres multiple de ce nombre
+            for(j = i + 1; j <= nombre - 2; j++) {
+                if (valeur[j] % valeur[i] == 0) {
+                    marqueur[j] = 1;
+                    break;
+                }
+            }
+        }
+        // Augmentation compteur
+        compteur++;
+    }
+    // Creation du resultat
+    for(let i = 0; i < compteur; i++) {
+        // Recuperation des nombres non marqué
+        for(j = mem; j < nombre - 2; j++) {
+            if (marqueur[j] === 0) {
+                // Ajout du nombre
+                retour[i] = valeur[j];
+                // Pour ne pas le reprendre
+                marqueur[j] = 2;
+                mem = j;
+                // Pour s'arreter
+                break;
+            }
+        }
+    }
+    // Retour
+    return retour;
+}