RosettaCodeData/Task/AKS-test-for-primes/QuickBASIC/aks-test-for-primes.basic
2026-04-30 12:34:36 -04:00

76 lines
1.7 KiB
Text

' AKS test for primes
DECLARE SUB PascalTriangle (N%, PasTri&())
DECLARE FUNCTION IsPrime% (N%)
DECLARE SUB ExpandPoly (N%)
CONST PASTRILAST% = 33 ' for 32-bit integer type
CONST TRUE% = -1, FALSE% = 0
FOR N% = 0 TO 9
CALL ExpandPoly(N%)
NEXT N%
FOR N% = 2 TO PASTRILAST%
IF IsPrime%(N%) THEN PRINT USING "###"; N%;
NEXT N%
PRINT
END
SUB ExpandPoly (N%)
DIM VZ$(0 TO 1)
VZ$(0) = "+"
VZ$(1) = "-"
DIM PasTri&(0 TO PASTRILAST%)
IF N% > PASTRILAST% THEN
PRINT N%; "is out of range"
STOP
END IF
SELECT CASE N%
CASE 0
PRINT "(x - 1) ^ 0 = 1"
CASE 1
PRINT "(x - 1) ^ 1 = x - 1"
CASE ELSE
CALL PascalTriangle(N%, PasTri&())
PRINT "(x - 1) ^"; N%; " = x ^"; N%;
BVZ% = 1
FOR J% = N% - 1 TO N% \ 2 + 1 STEP -1
PRINT VZ$(BVZ%); PasTri&(N% - J%); "* x ^"; J%;
BVZ% = ABS(1 - BVZ%)
NEXT J%
FOR J% = N% \ 2 TO 2 STEP -1
PRINT VZ$(BVZ%); PasTri&(J%); "* x ^"; J%;
BVZ% = ABS(1 - BVZ%)
NEXT J%
PRINT VZ$(BVZ%); PasTri&(1); "* x ";
BVZ% = ABS(1 - BVZ%)
PRINT VZ$(BVZ%); PasTri&(0)
END SELECT
END SUB
FUNCTION IsPrime% (N%)
DIM PasTri&(0 TO PASTRILAST%)
IF N% > PASTRILAST% THEN
PRINT N%; "is out of range"
STOP
END IF
CALL PascalTriangle(N%, PasTri&())
Res% = TRUE%
I% = N% \ 2
DO WHILE Res% AND (I% > 1)
Res% = Res% AND (PasTri&(I%) MOD N% = 0)
I% = I% - 1
LOOP
IsPrime% = Res%
END FUNCTION
SUB PascalTriangle (N%, PasTri&())
' Calculate the N'th line 0.. middle
PasTri&(0) = 1
J% = 1
DO WHILE J% <= N%
J% = J% + 1
K% = J% \ 2
PasTri&(K%) = PasTri&(K% - 1)
FOR K% = K% TO 1 STEP -1
PasTri&(K%) = PasTri&(K%) + PasTri&(K% - 1)
NEXT K%
LOOP
END SUB