From 04:00 PM CDT – 08:00 PM CDT (09:00 PM UTC – 01:00 AM UTC) Tuesday, April 16, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Supprimer des nombres premiers dans un tableau 2D d'entiers

Solved!
Go to solution

Bonjour,

J'ai créé un programme qui génère des nombres dit fortement probablement premiers : ce sont des entiers qui sont presque tout le temps premiers : je souhaiterai conserver uniquement ceux qui ne sont pas premiers (on dit qu'ils sont pseudo-premiers-forts).

Voici la partie de programme qui est censée supprimer ces nombres premiers de mon tableau 2D d'entiers :

code Labview.png

Comme vous pourrez le constater en exécutant le programme en pièce jointe, je dispose d'un sous VI qui est une fonction booléenne qui renvoie vrai si un nombre est premier, et faux sinon ("Nb premier" sur le diagramme). Je ne comprend pas pourquoi cette partie de code n'a aucun effet. La première colonne de mon tableau est constituée d'entiers (ce que j'appelle la "base").

J'ajoute les deux sous-programmes que j'utilise en pièces jointes, au cas où (mais je n'ai pas de problème avec eux).

Pourriez-vous m'indiquer une méthode sûre pour supprimer des nombres premiers d'un tableu d'entiers 2D ?

Je vous en remercie vivement par avance !

0 Kudos
Message 1 of 3
(2,906 Views)
Solution
Accepted by topic author perce-neige

Deux remarques sans avoir pris le temps de regarder votre code en détail :

 

  1. Un tableau 2D comporte obligatoirement le même nombre de lignes dans chaque colonne. Vous traitez le tableau 2D colonne par colonne pour supprimer les nombres premiers de chacune d'elles. Puisque le nombre d'éléments à supprimer peut être différent d'une colonne à l'autre, cette méthode n'est pas recommandée. LabVIEW va tenir compte de la colonne avec le plus de nombre et va compléter les autres avec des 0. Dans votre cas, par chance, le résultat peut être acceptable mais vous comprendrez que c'est un peu boiteux.
  2. Si le nombre est premier, il est supprimé de la colonne en cours. La taille de la colonne se réduit donc et les nombres qui suivent celui qui vient d'être effacé se décalent donc vers l'avant. Cela revient à dire qu'à la prochaine itération de la boucle FOR interne, le tableau (colonne), transmis par un registre à décalage, ne sera plus le même. Or vous ne tenez pas compte de cela en utilisant le compteur d'itération (i) de la boucle sans le corriger à chaque fois qu'un nombre premier a été supprimé. Le nombre suivant celui qui vient d'être supprimé échappera donc à l'analyse.

 

Je vous laisse réfléchir à la manière de corriger votre code.

 

PS : Le sous-VI vérifiant la primauté du nombre comporte une séquence empilée et des variables locales inutiles et rendant la lecture du code plus difficile.

 

 

 

0 Kudos
Message 2 of 3
(2,886 Views)
Solution
Accepted by topic author perce-neige

Bonsoir JB.

Je vous remercie pour vos conseils : ils m'ont permis de résoudre mon problème (le tableau se calcule en quelques secondes).

J'ai simplement dû changer un noeud "supprimer un élément d'un tableau" par un noeud "remplacer un élément d'un tableau" (par la valeur 0 qui convenait bien) afin de tenir compte de votre remarque N°2, et pour supprimer les zéros de mon tableau, j'ai utilisé un vi que j'ai trouvé sur le site de NI : 2D Array Search & Delete.vi : je l'ai très légèrement modifié en supprimant la temporistaion de 5 ms afin que le calcul soit plus rapide.

Même si ce n'est pas parfait, je met à disposition des autres utilisateurs ce travail sous la forme des deux programmes en pièces jointes.

Quant à mon programme, je vais en faire un exécutable (pour présenter mes résultats).

Cordialement, Thomas

0 Kudos
Message 3 of 3
(2,868 Views)