RosettaCodeData/Task/AKS-test-for-primes/XBasic/aks-test-for-primes.basic
2025-08-11 18:05:26 -07:00

84 lines
1.9 KiB
Text

PROGRAM "akstest"
' AKS test for primes
DECLARE FUNCTION Entry ()
INTERNAL FUNCTION ExpandPoly(n@@)
INTERNAL FUNCTION PascalTriangle(n@@, @pasTri&&[])
INTERNAL FUNCTION IsPrime(n@@)
INTERNAL FUNCTION Vz$(b@)
$$PasTriMax = 33 ' for 32-bit integer type
FUNCTION Entry()
FOR n@@ = 0 TO 9
ExpandPoly(n@@)
NEXT
FOR n@@ = 2 TO $$PasTriMax
IF IsPrime(n@@) THEN PRINT FORMAT$("###", n@@);
NEXT
PRINT
END FUNCTION
FUNCTION ExpandPoly(n@@)
DIM pasTri&&[$$PasTriMax]
IF n@@ > $$PasTriMax THEN
PRINT n@@; " is out of range"
QUIT(1)
END IF
SELECT CASE n@@
CASE 0:
PRINT "(x - 1) ^ 0 = 1"
CASE 1:
PRINT "(x - 1) ^ 1 = x - 1"
CASE ELSE:
PascalTriangle(n@@, @pasTri&&[])
PRINT "(x - 1) ^"; n@@; " = x ^"; n@@;
bVz@ = $$TRUE
FOR j@@ = n@@ - 1 TO n@@ \ 2 + 1 STEP -1
PRINT " "; Vz$(bVz@); pasTri&&[n@@ - j@@]; " * x ^"; j@@;
bVz@ = NOT bVz@
NEXT
FOR j@@ = n@@ \ 2 TO 2 STEP -1
PRINT " "; Vz$(bVz@); pasTri&&[j@@]; " * x ^"; j@@;
bVz@ = NOT bVz@
NEXT
PRINT " "; Vz$(bVz@); pasTri&&[1]; " * x ";
bVz@ = NOT bVz@
PRINT Vz$(bVz@); pasTri&&[0]
END SELECT
END FUNCTION
FUNCTION PascalTriangle(n@@, @pasTri&&[])
' Calculate the n@@'th line 0.. middle
pasTri&&[0] = 1
j@@ = 1
DO WHILE j@@ <= n@@
INC j@@
k@@ = j@@ \ 2
pasTri&&[k@@] = pasTri&&[k@@ - 1]
FOR k@@ = k@@ TO 1 STEP -1
pasTri&&[k@@] = pasTri&&[k@@] + pasTri&&[k@@ - 1]
NEXT
LOOP
END FUNCTION
FUNCTION IsPrime(n@@)
DIM pasTri&&[$$PasTriMax]
IF n@@ > $$PasTriMax THEN
PRINT n@@; " is out of range"
QUIT(1)
END IF
PascalTriangle(n@@, @pasTri&&[])
res@ = $$TRUE
i@@ = n@@ \ 2
DO WHILE res@ AND (i@@ > 1)
res@ = res@ AND (pasTri&&[i@@] MOD n@@ = 0)
DEC i@@
LOOP
RETURN res@
END FUNCTION
FUNCTION Vz$(b@)
IF b@ THEN RETURN "-" ELSE RETURN "+"
END FUNCTION
END PROGRAM