[R] Définir array

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Varal7
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 02 sept. 2008 17:22
Status : Hors ligne

[R] Définir array

#1

Message par Varal7 »

Bonjour, je souhaite créer un script qui me permette de faire la liste des premiers nombres premiers
Voici :

Code : Tout sélectionner

dim $premier[0] = 2
$nombre_de_nombre_premier = 0

for $nombre = 3, to 100
    for $i = 0, to $nombre_de_nombre_premier
        if $i = $nombre_de_nombre_premier Then
            if $nombre/$premier[$i] = int($nombre/$premier[$i]) Then
                ExitLoop
            Else
                $premier[$nombre_de_nombre_premier+1] = $nombre
                $nombre_de_nombre_premier = $nombre_de_nombre_premier+1
            EndIf
            
            if $nombre/$premier[$i] = int($nombre/$premier[$i]) Then
                ExitLoop
            EndIf
            
        EndIf
    Next
Next

For $count = 0 to $nombre_de_nombre_premier 
    
    MsgBox(0,"Nombre permier #"&$count, $premier[$count])
Next
Le débugguer me dit : Array variable subscript badly formatted.

Comment définir un Array sans donner la valeur à chaque varaiable ?

Merci d'avance
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R]Définir array

#2

Message par sylvanie »

Le plus simple à mon goût, après c'est une histoire de préférence, c'est de passer par une chaîne de caractère que l'on retransforme grâce à stringsplit, exple "2|3|5 ...."

cijoint l'algo avec cette méthode + une petite optimisation :

Code : Tout sélectionner

$premier = "2"
$nombre_de_nombre_premier = 0


for $nombre = 3 to 100
    $tab_premier=StringSplit($premier,"|")
    $nombre_de_nombre_premier=$tab_premier[0]
    $is_prime_number=1
    $limite_to_search=Sqrt($nombre)
    
    for $i = 1 to $nombre_de_nombre_premier 
        $division=$nombre/$tab_premier[$i]
        if  $division = int($division) Then
            ; not prime number
            $is_prime_number=0
            ExitLoop
        Else
            If ($limite_to_search>$division)  Then
                ;the search may be interrupted due to the fact that if another greater 
                ;prime number devides $nombre then the second coefficient will be smaller than $tab_premier[$i]
                ; ie this one would have to devide it before to reach this value ...
                ExitLoop
            EndIf
        EndIf
    Next
    if ($is_prime_number=1) Then
        ;prime number detected
        $premier&="|"&$nombre
    EndIf
Next

$final_msg=""
For $count = 1 to $nombre_de_nombre_premier 
    $final_msg&="Nombre permier #"&$count&" : "&$tab_premier[$count]&@CRLF
Next

MsgBox(0,"List of prime numbers up to 100", $final_msg)
 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] Définir array

#3

Message par sylvanie »

Allez, pour la route, un petit concours, entre la dernière méthode classique vue précédement et le test de Rabin-Miller (cf http://teal.gmu.edu/crypto/student_proj ... sld006.htm par exple) :
► Afficher le texte
Sur mon vieux PC :
75 secondes pour la méthode 1 et 10000 nombres à analyser
25 secondes pour Rabin-Miller
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Varal7
Niveau 1
Niveau 1
Messages : 10
Enregistré le : mar. 02 sept. 2008 17:22
Status : Hors ligne

Re: [R] Définir array

#4

Message par Varal7 »

Merci beaucoup beaucoup.
Désolé de ne répondre que maintenant, mais j'ai été pris par le temps.

Code : Tout sélectionner

HotKeySet("{ESC}", "Terminate")

$premiers = "2"
$nombre_de_nombre_premier = 0

MsgBox(0, "ATTENTION", "A été testé sur windows XP et Vista")
MsgBox(0, "Important", "Si le porgramme a déjà été utilisé, merci de supprimer le fichier nbr_ prem1.txt")
$fin = inputBox("Premiers nombres premiers", "Jusqu à quel nombre voulez-vous effectuer le test ?"&@CRLF&">10 000 déconseillé",100)
MsgBox(0,"Arrêter le programme","À tout moment vous pouvez arrêter le programme par la touche Echap")

progressOn("Recherche en cours","Nombres testés :","0")

for $nombre = 3 to $fin ;$nombre est le nombre qu'on teste
    progressSet($nombre/$fin*100,$nombre&" sur "&$fin)
    $premier_array=StringSplit($premiers,"|") ;$premiers = 2|3|5|7|11|... et on en fait un array $premier_array : 
                                            ;$premier_array[1] = 2 ; $premier_array[2] = 3 ; etc. 
                                            ;et $premier_array[0] est égal au nombre de valeurs.
    $nombre_de_nombre_premier=$premier_array[0]
    $est_premier=true                       ;on dit que $nombre est premier. 
    $limite_du_test =Sqrt($nombre)
   
    for $i = 1 to $nombre_de_nombre_premier
        $quotient=$nombre/$premier_array[$i]
        if  $quotient = int($quotient) Then ;si l'approximation décimale est égale à la partie entière de l'approxiamtion
            $est_premier=false          ;alors $nombre n'est pas premier
            ExitLoop                        ; et on peut alors sortir de la boucle et passer à $nombre =$nombre+1
        Else
            If ($limite_du_test>$quotient)  Then
                ;On atteint la racinne carrée et il devient inutile de continuer
                ExitLoop
            EndIf
        EndIf
    Next
    if ($est_premier=true) Then ; si le nombre est premier, on le rajoute à la liste
        $premiers= $premiers&"|"&$nombre
    EndIf
Next
ProgressOff()

ProgressOn("Ecriture des nombres premiers", "Nombres écrits :")
$final_msg=""
For $count = 1 to $nombre_de_nombre_premier
    progressset($count/$nombre_de_nombre_premier*100,$count&" sur "&$nombre_de_nombre_premier)
    $final_msg&="Nombre premier #"&$count&" : "&$premier_array[$count]&@CRLF
Next
progressoff()
FileWrite("nbr_prem1.txt",$final_msg);on stocke les nombres premiers dans le fichier "nbr_prem1.txt"
MSgBox(0,"Recherche terminée","Les nombres premiers sont stockés dans le fichier nbr_prem1.txt")
call("Terminate")
Func Terminate()
    MsgBox(0,"About", "http://www.autoitscript.fr/forum/viewtopic.php?f=3&t=1558")
Exit 0
EndFunc
Voici le code que j'en ai tiré, assorti de commentaire...
Répondre