    1MODE 12
    2FOR d = 1 TO 2
    3PRINT'' "bbc basic v/64 prog ""calc.factors.LgeFactor.powrabc"",  24.05.98. 5.9.99"
    4PRINT "n.b.  * basic64.    ds mcdonald, wellington, 20/5/99.  14:25 pm."CHR$7
    5IF d=1 THEN INPUT ''"spool to *ram. moddata,   1 = yes, 0 = no.";sp
    6IF sp = 1 THEN
    7PRINT "yes   CONT."GET$
    8*ram
    9*sp. moddata
   10ENDIF
   11NEXT d
   12INPUT ' "enter base [retn 2], a = ";a$      "   reduced printout/  index  "P%
   13n = P%   :  NOW = TIME
   14IF a$ = "" THEN a =2   ELSE  a = EVAL a$
   15
   16PRINT  a$  "  =  "; a
   17ON ERROR  : PRINT; ERR " at erl. ";ERL ; :  IF ERR=17 THEN PRINT"close #0"CHR$7 : CLOSE#0  : STOP
   18PRINT : REM  CHR$7
   19
   20REPEAT
   21   n +=1
   22   IF n MOD 2 = 0 THEN n +=1
   23   FOR i = 3 TO SQR n STEP 2
   24   IF n MOD i  THEN NEXT i  :  i = n
   25   UNTIL i = n
   26   PRINT ' "next prime = "; n  "  " ;
   27
   28
   29s=1  :  st=2*n  :  min=1
   30   REM  INPUT ' "test condition  for pause..cont.   " '' "test = TRUE"'"test = -1"'"ABS test < 20"' "e.g.  test^2 = 1.    ", test$
   31   test$ = "test = 1 "  :  REM  PRINT test$
   32   test = 1  :  REM  0
   33REM   INPUT "only Coprime 2,3,5,7,11,13.  Yy"; c$
   34REM      IF INSTR("Yy", c$) THEN          PRINT  "Yes."
   35   NOW = TIME
   36
   37   FOR p = s TO 2^30 STEP st
   38      IF p < min THEN NEXT p :
   39      REM p = p + st*INT((min-p)/st  ) :P."cont."p GET$ :NEXT p
   40
   41      IF INSTR("Yy", "y" ) THEN
   42         IF p MOD 2 = 0  THEN ENDIF : NEXT p
   43         FOR q = 3 TO 13 STEP 2
   44            IF p MOD q = 0  THEN q = 17
   45            NEXT q
   46         IF q = 17 THEN ENDIF  : NEXT p
   47         
   48
   49      test = FNPower(a, n, p)
   50      IF EVAL( test$)  THEN
   51        P% = n:
   52        PRINT  '; "k = ";(p-1)/n  " . LOG = ";INT(10*LOG p)", ";p " divides  ";a "^ "; n " -1 .. csec = "TIME-NOW
   53        n1 = n-1
   54PRINT "divisors of n-1 = "; n1  CHR$(7)
   55FOR q = 1 TO SQR n
   56   IF n1 MOD q = 0 THEN PRINT ; "= "q "*" n1/q "/ ";  :  IF POS > 50 THEN PRINT
   57   NEXT q
   58REM  P. CHR$(7) GET$ :
   59        ERROR :
   60        ELSE
   61        PRINT ","; :
   62        IF POS > 66 THEN PRINT ';p "  csec= ";TIME-NOW"  ";
   63           ENDIF
   64      test = 0:  REM clear flag
   65      ENDIF
   66      NEXT p
   67OTHERWISE
   68REM "s", "S"
   69p = EVAL p$
   70PRINT  p$ "  =  "; p
   71
   72PRINT ; "result = "; FNPower(a, n, p)
   73
   74   OTHERWISE
   75
   76   ENDCASE
   77UNTIL FALSE
   78END
   79REM (c) Now use a good algorithm to compute a power modulus 
   80REM  for example :
   81    DEF FNPower( a, n1, p)
   82       r = 1
   83       x = a
   84       WHILE ( n1>0)
   85    IF n1 MOD 2 THEN
   86            r = FNmod(r*x,p)
   87            REM  :  PRINT r
   88            ENDIF
   89              x = FNmod(x*x,p)
   90              REM x = x - p*INT(x/p+.5)
   91              REM  MOD p
   92               n1 = n1 DIV 2
   93    ENDWHILE :  REM           }
   94    REM    return(r);
   95   = r
   96
   97DEF FNmod(z,y)
   98IF z = z+1  THEN ERROR
   99 = z - y*INT(z/ y+.5)
  100       END
  101 
  102   REM  *> Good Luck...
  103   REM   
  104   REM   -- 
  105   REM   Philippe Langevin,
  106   REM   http://www.univ-tln.fr/~langevin/  */