Polynôme d'Euler et nombre premier (Matlab)

Bonjour,
le polynôme d'Euler $X^2+X+41$ pour $X$ de 0 à 40 prend des nombres premiers:[41, 43, 47, 53, 61, 71, 83, 97, 113, 131, 151, 173, 197, 223, 251, 281, 313, 347, 383, 421, 461, 503, 547, 593, 641, 691, 743, 797, 853, 911, 971, 1033, 1097, 1163, 1231, 1301, 1373, 1447, 1523] au 41 eme valeur on a $1601=41^2$ qui n'est pas premier.

Je fais un programme Matlab.
Variable
q,cp, i: entiers
Debut
Ecrire ('veuiller entrer les valeurs de q")
Lire(q)
P<---- X*X+X+q
cp<----0
Pour i allant de 0à q-2 faire 
si q mod i=0 alors
cp<---- 1 
Sinon P(i) mod q=
fin si
Ecrire ("P(i) est premier")
Fin
ça ne marche pas, peut-être c'est au niveau du nombre premier.

Merci en avance.

Réponses

  • Bonjour,

    Ce que tu as écrit n'est pas du Matlab. Montre nous du Matlab.

    Cordialement,

    Rescassol
  • Personnellement je suis plus Scilab que Matlab, mais c'est pratiquement la même chose; il suffit de construire une matrice (n,3) avec (i, nombre, modulo), puis de chercher les termes non nuls dans la colonne 3 avec "find" (grâce à la vectorisation, aucune boucle n'est nécessaire et il suffit de quelques lignes).

    Paul
       2.    47.     1. 
       3.    53.     2. 
       4.    61.     1. 
       5.    71.     1. 
       6.    83.     5. 
       7.    97.     6. 
       8.    113.    1. 
       9.    131.    5. 
       10.   151.    1. 
       11.   173.    8. 
       12.   197.    5. 
       13.   223.    2. 
       14.   251.    13.
       15.   281.    11.
       16.   313.    9. 
       17.   347.    7. 
       18.   383.    5. 
       19.   421.    3. 
       20.   461.    1. 
       21.   503.    20.
       22.   547.    19.
       23.   593.    18.
       24.   641.    17.
       25.   691.    16.
       26.   743.    15.
       27.   797.    14.
       28.   853.    13.
       29.   911.    12.
       30.   971.    11.
       31.   1033.   10.
       32.   1097.   9. 
       33.   1163.   8. 
       34.   1231.   7. 
       35.   1301.   6. 
       36.   1373.   5. 
       37.   1447.   4. 
       38.   1523.   3. 
       39.   1601.   2. 
       40.   1681.   1. 
       42.   1847.   41.
       43.   1933.   41.
       44.   2021.   41.
       45.   2111.   41.
       46.   2203.   41.
       47.   2297.   41.
       48.   2393.   41.
       49.   2491.   41.
       50.   2591.   41.
    
  • Bonjour,
    je vois la source de ton programme pour transformer en Matlab (comme vous dites que Scilab et Matlab sont très proche).
    Merci de m'eclaircir comment on construit avec une matrice.

    Sdoula.
  • Bonsoir,

    Tu as dit au début que tu faisais un programme Matlab.
    Montre nous le et on te dira où il y a une erreur.

    Cordialement,

    Rescassol
  • Le polynôme est représenté en Matlab par un vecteur ligne contenant la liste des coefficients par ordre de degré décroissant (chose que je n'ai pas fait au debut).
    var X: P(X);
    begin
    P=[1 1 41]
      writeln('Les nombres premier P(n) de 1 à 100 :');
      for X := 1 to 100 do
      begin
        if isPrime(polyval (P, X)) then
          write(X,', ');
      end;
    end;
    
    Le problème ça s'affiche:
    "parse error near line 5 of file /web/com/1556396021_121147/main.m
      syntax error
    >>> for X = 1 to 5 do"
                     ^
    
  • Bonjour,

    Ton code n'est toujours pas du Matlab, ça ressemble plus à du Pascal.

    Cordialement,

    Rescassol
  • Il y a différentes façons de créer un matrice, mais l'étape fondamentale c'est l'initialisation (l'allocation dynamique est à proscrire car chère et lente); ensuite tu remplis les cellules.
    n = 50;
    A = zeros(n,3);
    

    L'idée en Matlab/Scilab, c'est de travailler sur des matrices
  • Bonjour,

    Voilà quelque chose qui est correct en Matlab, et qui ressemble peut-être plus à ce que tu cherches:
    P=[1 1 41];
    T=[];
    disp('Les nombres premier P(n) de 1 à 100 :')
    for X=1:100
        if isprime(polyval(P,X))
            T=[T X];
        end
    end
    disp(T)
    

    Cordialement,

    Rescassol

    Edit: Au passage, $41^2=1681$ et non $1601$.
  • Merci, apres execusion on trouve
    Les nombres premier P(n) de 1 à 100 :
    Columns 1 through 13:

    1 2 3 4 5 6 7 8 9 10 11 12 13

    Columns 14 through 26:

    14 15 16 17 18 19 20 21 22 23 24 25 26

    Columns 27 through 39:

    27 28 29 30 31 32 33 34 35 36 37 38 39

    Columns 40 through 52:

    42 43 45 46 47 48 50 51 52 53 54 55 57

    Columns 53 through 65:

    58 59 60 61 62 63 64 66 67 68 69 70 71

    Columns 66 through 78:

    72 73 74 75 77 78 79 80 83 85 86 88 90

    Columns 79 through 86:

    92 93 94 95 97 98 99 100

    Le probleme , on a pas les nombre premiers d'Euler, peut etre au niveau du l'avant dernier ligne T=[T,X].
  • Bonsoir,

    Je n'ai corrigé que l'aspect informatique de ce que tu avais fait.
    Pour l'aspect mathématique, à toi de préciser ce que tu veux.

    Ton programme initial ne demande pas d'afficher des nombres premiers, ma correction non plus.

    Cordialement,

    Rescassol
  • P=[1 1 41];
    T=[];
    disp('Les nombres premier P(n) de 1 à 100 :')
    for X=1:100
    if isprime(polyval(P,X))
    T=[T polyval(P,X)];
    end
    end
    disp(T)

    J'ai juste changé le X par (polyval(P,X) et j'obtient les image de P premiers (les nombres premiers d'Euler) et on obtient le resultat voulu:
    Les nombres premier P(n) de 1 à 100 :
    Columns 1 through 10:

    43 47 53 61 71 83 97 113 131 151

    Columns 11 through 20:

    173 197 223 251 281 313 347 383 421 461

    Columns 21 through 30:

    503 547 593 641 691 743 797 853 911 971

    Columns 31 through 40:

    1033 1097 1163 1231 1301 1373 1447 1523 1601 1847

    Columns 41 through 50:

    1933 2111 2203 2297 2393 2591 2693 2797 2903 3011

    Columns 51 through 60:

    3121 3347 3463 3581 3701 3823 3947 4073 4201 4463

    Columns 61 through 70:

    4597 4733 4871 5011 5153 5297 5443 5591 5741 6047

    Columns 71 through 80:

    6203 6361 6521 7013 7351 7523 7873 8231 8597 8783

    Columns 81 through 86:

    8971 9161 9547 9743 9941 10141

    Merci encore.
    Sdoula
  • c'est un peu hors sujet, mais je trouve dommage de faire appel à l'allocation dynamique de mémoire; dans la cas présent, il est simple d'initialiser la taille de la matrice (et c'est une habitude à prendre quand on traite plusieurs centaines de milliers de lignes voire plusieurs millions).

    En Scilab (je ferais la même chose en python par exemple avec Numpy), le code suivant fait le boulot (à l'affichage près):
    n = 50;
    x = (1 : n)';
    A = zeros(n,3);
    A(:,1) = x;
    A(:,2) = x .**2 + x + 41;
    A(:,3) = modulo(A(:,2),A(:,1));
    nombres_premiers = A(find(A(:,3) <> 0),1:2)
    

    Paul
  • Pour le fun, en python:
    import numpy as np
    import time
    
    n = 1_000_000;
    t0 = time.time();
    x = np.arange(1,n+1);
    A = np.zeros((n,3), dtype = np.int);
    A[:,0] = x;
    A[:,1] = x**2 + x + 41;
    A[:,2] = np.mod(A[:,1],A[:,0]);
    nombres_premiers = A[np.where(A[:,2] != 0),0:2];
    t1 = time.time()
    print("Durée: {}".format(t1-t0));
    del A; del n; del x;
    
Connectez-vous ou Inscrivez-vous pour répondre.