RosettaCodeData/Task/Jacobi-symbol/Action-/jacobi-symbol.action
2023-07-01 13:44:08 -04:00

66 lines
925 B
Text

INCLUDE "D2:PRINTF.ACT" ;from the Action! Tool Kit
INT FUNC Jacobi(INT a,n)
INT res,tmp
IF a>=n THEN
a=a MOD n
FI
res=1
WHILE a
DO
WHILE (a&1)=0
DO
a=a RSH 1
tmp=n&7
IF tmp=3 OR tmp=5 THEN
res=-res
FI
OD
tmp=a a=n n=tmp
IF (a%3)=3 AND (n%3)=3 THEN
res=-res
FI
a=a MOD n
OD
IF n=1 THEN
RETURN (res)
FI
RETURN (0)
PROC PrintTable(INT maxK,maxN)
INT res,n,k
CHAR ARRAY t(10)
Put('n) Put(7) Put('k) Put(124)
FOR k=0 TO maxK
DO
StrI(k,t) PrintF("%3S",t)
OD
PutE()
Put(18) Put(18) Put(18) Put(19)
FOR k=0 TO 3*maxK+2
DO
Put(18)
OD
PutE()
FOR n=1 TO maxN STEP 2
DO
StrI(n,t) PrintF("%3S",t)
Put(124)
FOR k=0 TO maxK
DO
res=Jacobi(k,n)
StrI(res,t) PrintF("%3S",t)
OD
PutE()
OD
RETURN
PROC Main()
Put(125) PutE() ;clear the screen
PrintTable(10,39)
RETURN