    1MODE 12
    2FOR d = 1 TO 2
    3PRINT "BEST NEEDS basic64" '
    4PRINT " progm--    fin.soc.acorncpusr.donWn994/2.pi.facthcff. byte/zeta4"
    5PRINT "don mcdonald,    18.07.99  12:30 PM. 16:00. 22:25" '
    6
    7PRINT  "Examples : 1E15-1,  1E18/999 999,  2^37-1,  2^31-1"
    8PRINT  "2^33-9 prime,  6763*10627*29947 Maple IsPrime"
    9PRINT "1E10-1, 1E11-1,  1E12-1, 1E14-1, 2^32+1 Euler, 13^10+1"
   10PRINT "1E13-1, 1E16-1,  100 895 598 169 Mersenne"
   11PRINT  "10 662 526 601,  15 527 402 881." '
   12IF d = 1 THEN
   13INPUT  "Spool  *RAM.  factoRAM   1 = yes "; y
   14IF y = 1 THEN
   15   *RAM
   16   *SP. factoRAM
   17   PRINT "YES."
   18   ENDIF
   19
   20ENDIF
   21NEXT d
   22
   23ON ERROR REPORT :  PRINT " CLOSE SPOOL. at  erl ...  "ERL
   24REPEAT
   25PRINT ' "factor 5 byte integer, max 2^40  gets most factors .TEST bugs"
   26INPUT "enter no. / expression  . Qq/ 0 <CR> = quit  "; x$
   27IF INSTR("Qq0", x$ ) THEN
   28  PRINT  "progm facthcff.   e n d.    CLOSEs * RAM SPOOL"
   29  : CLOSE#0: END
   30  ENDIF
   31
   32x = EVAL(x$)
   33@% = 10
   34PRINT x$ " = " ; x ' CHR$(7)
   35x1 = x
   36now = TIME
   37
   38TW = 1  :  T = 0
   39REPEAT
   40   IF TW = x1 THEN PRINT T "-th PWR OF 2" :  ERROR TW , "PWR 2."
   41   TW = 2*TW   :  T += 1
   42   UNTIL TW > x1
   43
   44IF x < 2^31 THEN  PROCfast(x)  ELSE PROCHhcf(x)
   45UNTIL FALSE
   46
   47
   48DEF PROCfast(x)
   49  REM  PRINT ' "fast fact. "x "  max 22 sec." CHR$(7) : REM  GET$
   50  WHILE x MOD 2 = 0
   51          PRINT  ; 2 " * " x/2
   52          x = x DIV 2
   53          ENDWHILE
   54  
   55  j = 1
   56  REPEAT  j += 2
   57  WHILE x MOD j = 0
   58    PRINT  ; j " * " x/j
   59    x = x DIV j
   60    ENDWHILE
   61    UNTIL j*j > x OR x = 1
   62  
   63    PRINT ; x " prime." TAB(18) " centisec = "; (TIME - now)
   64
   65ENDPROC
   66  ELSE
   67
   68DEF PROCsplit(x)
   69    PRINT  "  x  > 2 ^31.  slow e.g. minutes." CHR$(7)
   70    j = 2* INT(x / 2^31 ) - 1
   71    IF j < n THEN j = n-6
   72    IF j > 2^20 THEN PRINT  x "  too big. loss of accuracy. stop  <ESC> " : REM STOP
   73
   74
   75x1 = x
   76rt = SQR(x1)
   77PRINT "TRY FOR j = "; j+2 "  TO SQRT = " rt  "  STEP 2."
   78REPEAT   j += 2
   79  UNTIL (x1 = j * INT( x1/ j)  )  OR   j > rt
   80  x1 = x1/j
   81  PRINT "factors ?   x1 =  j*x1 =   ";  j" *  "x1 ' "   centiseconds = " (TIME -now )  CHR$(7) '' " You have 10 seconds to press a key."
   82  a$ = INKEY$(1000)
   83  j1 = j
   84  IF x1 = INT(x1) THEN
   85     PROCfast(j)  :  PROCfast(x1)
   86     PRINT ; j1 " * " x1
   87
   88ELSE
   89    PRINT  "No Factors."
   90ENDIF
   91
   92  ENDPROC
   93
   94DEF PROCHhcf(x)
   95x1 = x  :  PRINT "proc Hhcf(x = "; x1
   96c = 6 : REM  2*3*5*7*11*13*17*19*23
   97t31 = 2^31  :  c2 = 0
   98FOR n = 5 TO 5000  STEP 6
   99c1 = c * n*(n+2)
  100IF c1 > t31 THEN
  101   c1 = c * INT( t31 / c)
  102   x1 = FNhcf(x1, c1)
  103      IF x1 < t31 THEN PROCfast(x1) :  ENDPROC
  104   c = c2 * n*(n+2)
  105   ELSE
  106     c = c1
  107   ENDIF
  108   NEXT n
  109   x1 = FNhcf(x1,c )
  110
  111IF x1 > t31 THEN PROCsplit(x1)
  112ENDPROC
  113
  114DEF FNhcf(x,c1)
  115REM  PRINT "proc hcf(x,c1  =  "; x "  " c1
  116m = x - c1* INT( x / c1)
  117WHILE  m > 0
  118         REM PRINT m
  119         x = c1
  120         c1 = m
  121         m = x MOD c1
  122         ENDWHILE
  123         c2 = c1  :  REM Return to proc Hhcf.
  124         IF c1 > 1 THEN
  125         PRINT ' " HCF = "; c1   :
  126         PRINT ; x1 "  Factor = "; c1  " * "x1 / c1
  127           PROCfast(c1)
  128         ENDIF
  129= x1/c1
  130ENDPROC