Bill Allombert on Sun, 20 Nov 2022 12:29:08 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Fonction parforprime et sortie en désordre


On Sun, Nov 20, 2022 at 12:04:41PM +0100, Jean-Luc ARNAUD wrote:
> Bonjour,
> 
> Toujours en phase de découverte de Pari/GP, je ne trouve pas de solution à
> ce problème.
> 
> La commande suivante :
> 
>     ? forprime(i=2,100,if(ispseudoprime(2^i-1,1),print ("2^",i,"-1 est
> Premier"),print (strchr(9),"2^",i,"-1 est non Premier")))
> 
> fournit bien le résultat escompté, ci-dessous :
> 
> Par contre, la même commande en mode MT :
> 
>     ? parforprime(i=2,100,if(ispseudoprime(2^i-1,1),print ("2^",i,"-1 est
> Premier"),print (strchr(9),"2^",i,"-1 est non Premier")))
> 
> fournit un résultat en désordre :
> 
> Je comprends bien la raison de ce désordre, dû au fait que le MT retourne
> les résultats au fur et à mesure qu'ils sont calculés, dans un ordre non
> linéaire.
> Ma question porte plutôt sur la manière d'éviter cela, si elle existe (en
> dehors de se passer du MT) : stocker les résultats dans une variable chaîne

Il y a la solution de triant le fichier de sortie à la fin, mais la
bonne solution est d'utiliser la version complète de parforprime
et une Map ou une List pour stocker les résultats

[[ Use the full parforprime version and a Map or a List to store results ]

{
  my(M=Map());
  /* Compute values */
  parforprime(i=2,100,ispseudoprime(2^i-1,1)
             ,e,mapput(~M,i,e));
  /* print them */
  foreach(Vec(M),i,
    if(mapget(M,i),
      print ("2^",i,"-1 est Premier")
     ,print (strchr(9),"2^",i,"-1 est non Premier")));
}

Sincèrement,
Bill.