      PROGRAM MAIN
      IMPLICIT NONE
      INTEGER IFACT(11),II,I,INCR
      INTEGER NPREM,IPREM,INOM,IDIV,IRESTE
      LOGICAL LERAS(1000)
      LOGICAL LTST,LDIV

      DATA IFACT /2,3,5,7,11,13,17,19,23,29,31/

C la passoire d'Eratosthene

      DO I=1,1000
       LERAS(I)=.TRUE.
      END DO

C 1 n'est pas nombre premier

      LERAS(1)=.FALSE.

      DO I=1,11
       INCR=IFACT(I)
       DO II=INCR+INCR,1000,INCR
        LERAS(II)=.FALSE.
       END DO
      END DO

C les nombres premiers entre 1 et 1000
      NPREM=0
      DO I=2,1000
       IF (LERAS(I)) THEN
        NPREM=NPREM+1
       END IF
      END DO
      WRITE(6,*) ' nous avons ',NPREM,' nombres premiers < 1000'

C nous sauvons les nombres sur un fichier
      OPEN(UNIT=16,FILE='PREM.DAT',STATUS='UNKNOWN',FORM
     -   ='FORMATTED')
      WRITE(16,*) NPREM
      DO I=2,1000
       IF (LERAS(I)) WRITE(16,*) I
      END DO
      CLOSE(UNIT=16)

C



 100  CONTINUE
      WRITE(6,*) 
      WRITE(6,*) ' Donner un nombre entier < 1000000 '
      WRITE(6,*) ' (0 arrete le programme)'
      WRITE(6,*) 
      READ(5,*) INOM
      
      IF (INOM.NE.0) THEN

C test : INOM < 0 ?

       IF (INOM.LT.0) THEN
        WRITE(6,*) ' votre nombre doit etre > 0 '
        GO TO 100
       END IF

C la decomposition

       OPEN(UNIT=16,FILE='PREM.DAT',STATUS='OLD',
     -   FORM='FORMATTED')
 121   CONTINUE
       LDIV=.FALSE.
C lire combien il a des nombres dans le fichier
       READ(16,*) NPREM
       DO I=1,NPREM
        READ(16,*) IPREM
        IF (.NOT.LDIV) THEN
         IDIV=INOM/IPREM
         IRESTE=INOM-IDIV*IPREM
         IF (IRESTE.EQ.0) THEN
          WRITE(6,*) ' Nombre est divisible par ',IPREM
          INOM=INOM/IPREM
          LDIV=.TRUE.
         END IF
        END IF
       END DO
       IF (LDIV) THEN
        IF (INOM.NE.1) THEN
         REWIND(UNIT=16)
         GO TO 121
        END IF
       ELSE
        WRITE(6,*) INOM,' est nombre premier '
       END IF
       CLOSE(UNIT=16)

C nouveau essai

       WRITE(6,*) 
       WRITE(6,*) ' - - - - - - - - - - - - - - - - - - '
       WRITE(6,*) 
       GO TO 100
      END IF

      END
 
