SEQUENCE 6 - Un exemple de Malloc

Le sujet porte sur l'implémentation du crible d'Eratost&eagrave;ne qui consiste a construire dans la suite des N premiers entiers celle des nombres premiers. On peut le décrire informellement de la manière suivante :
1 et 2 sont premiers,
tant que on n'a pas dépassé une certaine borne :
      prendre le plus petit nombre non rayé et rayer tous ces
      multiples inférieurs a N
La liste des nombres non rayés est celle des nombres premiers
      inférieurs à N.
Si un tableau T est initialisé par T[i]:=i, barrer le nombre i peut être réalisé en effectuant T[i]:=0.

Première implémentation

Donner une première implémentation eratofix.c dans la quelle N sera fixé dans eratofix.h. La fonction d'impression des nombres premiers utilisera une fonction
 
int next_prime(int e) 
donnant l'entier premier immédiatement supérieur à e.

Implémentation pour une taille quelconque

On décide de passer la taille du crible via la ligne de commande. On rappelle que pour allouer un tableau de n cases de type T on doit écrire quelque chose du style :
T* t ;
...
t =     malloc(n * sizeof(T));
Ecrire un module permettant la prise en compte de cette situation. On écrira donc trois programmes erato.h, erato.c et main.c.

Amélioration du stockage

Vous avez utilise un tableau de la forme
 
    0 1 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 ...
pouvez-vous gagner de la place en tassant un peu tous ces nombres ? (par exemple en ne considerant aucun nombre pair ?!)
    3 5 7 0 11 13 0 17 19 0 23 ...

sujet de reflexion (facultatif)

Chaque appel à next_prime() provoque une boucle. Peut-on (en changeant un minimum d'implementation) gagner du temps de calcul dans le cas d'une utilisation intensive de la table ? On ne redéfinira pas erato.h