In a 4x4 magic square all rows, columns and the two main diagonals are distinct 4-digit prime numbers when read in either direction.
Create such a square.
Bonus (d4): same for order-5 magic square and 5-digit primes.
Based on
L. E. Card,Patterns in Primes, JRM 1:2, 1968, pp .93-99,
(In reply to
re(2): From the computer -semi-spoiler by brianjn)
Brian, you could speed up the prime test to make the program run faster.
The current prime test checks every number below the number being tested:
SUB primetest
prm = 0
s = 2
DO
IF (chk MOD s = 0) THEN prm = 1
s = s + 1
LOOP WHILE (s < chk AND prm = 0)
END SUB
First of all you need go only to (and including) the square root of the number under test; any factor above that would have a corresponding factor below it, or in the case of the square root itself just the square root of any perfect square.
Second, if you tested division by 2, and then went into a DO loop, you'd be able to increment by 2 rather than 1 and halve the number of tests. In fact, the below factoring program tests division by 2, 3 and 5 before starting off the loop with 7; from then on it only tests dividing by 8 out of every 30 numbers. Of course when seeking only primality, as soon as you obtained a factor lower than the number itself, you'd get out of the loop and declare the argument non-prime, rather than go on to find other factors.
SUB factor (num, s$)
s$ = "": n = ABS(num): IF n > 0 THEN limit = sqroot(n): ELSE limit = 0
IF limit <> INT(limit) THEN limit = INT(limit + 1)
dv = 2: GOSUB DivideIt
dv = 3: GOSUB DivideIt
dv = 5: GOSUB DivideIt
dv = 7
DO UNTIL dv > limit
GOSUB DivideIt: dv = dv + 4 '11
GOSUB DivideIt: dv = dv + 2 '13
GOSUB DivideIt: dv = dv + 4 '17
GOSUB DivideIt: dv = dv + 2 '19
GOSUB DivideIt: dv = dv + 4 '23
GOSUB DivideIt: dv = dv + 6 '29
GOSUB DivideIt: dv = dv + 2 '31
GOSUB DivideIt: dv = dv + 6 '37
IF INKEY$ = CHR$(27) THEN s$ = CHR$(27): EXIT SUB
LOOP
IF n > 1 THEN s$ = s$ + STR$(n)
EXIT SUB
DivideIt:
DO
q = INT(n / dv)
IF q * dv = n AND n > 0 THEN
n = q: s$ = s$ + STR$(dv): IF n > 0 THEN limit = sqroot(n): ELSE limit = 0
IF limit <> INT(limit) THEN limit = INT(limit + 1)
ELSE
EXIT DO
END IF
LOOP
RETURN
END SUB
|
Posted by Charlie
on 2012-01-21 11:02:43 |