'First Factors MGA.BAS 10/19/14
'modified 10/24/14 with screen displays improvement a neat general code tip!
' for email to SmallBASIC crew
'I was challenged/inspired by the featured Primes.BAS code in SmallBASIC forum 10/18/14
'First Factors works from a different angle producing an array that is actually useful
'for finding more than just prime numbers. Use it to factor any number up to...
'topN, I left it at 1223 because that is the 200th prime found with Primes.BAS
'on my machine and system I get .002+ or .004+ secs for 200 primes but .02+ something with Primes.BAS
'of course I've gone up to 100,000 for TopN with .2+ secs results
'The algorithm is based on Sieve of Eratostheses,
'old as Greek Geometry with some prime number study added.
'Ha! looking up how to spell Sieve of Eratostheses I learn of Euler's Sieve (Wiki)
'n+1... there is always more that one can do, if one can do something!
'THANK YOU SmallBASIC crew and the Open Code Spirit - MGA
'
' This program code is a great first tool for Number Theory Study
' I think it's pretty good for teaching SmallBASIC as well
'
option base 1
'===================== topN =1223 for first 200 primes
'===================== topN =1000000 2.5+secs to load, 3.7+ to load and count
topN=1223
testlimitN=sqr(topN)
dim ffA(topN+6)
'In first FOR loop:
'you could go nuts performance wise and build patterns with 30 or 210 which are prime factorials
'here is just 6=2*3 which is an improvement on just 2 odds and evens.
'Prime factorials: 30=2*3*5 and 210=2*3*5*7... these create ever expanding and overlapping patterns
tock=ticks
for i = 0 to topN step 6
ffA(i+1)=1:ffA(i+2)=2:ffA(i+3)=3:ffA(i+4)=2:ffA(i+5)=1:ffA(i+6)=2
next
ffa(2)=1:ffa(3)=1 'fix first two primes
for pcand=5 to testlimitN step 2
if ffA(pcand)=1 then
for i=pcand+pcand to topN step pcand
if ffA(i)=1 then ffA(i)=pcand : i=i+pcand 'booster shot .02 secs on 100,000
next
fi
next
tic=ticks
?
print topN; " First Factors Array Complete in ";(tic-tock)/tickspersec;" secs."
?
pcount=0
for i =2 to topN
if ffA(i)=1 then pcount =pcount +1
next
tic =ticks
print "In first ";topN;" numbers there are ";pcount;" Primes."
?
print " In case a prime is not a prime until it is counted as one:"
? "It took "; (tic-tock)/tickspersec; " secs to load First Factor Array and count it's Primes."
?
Print" press any "
?
pause
'the following demo's a neat way to display tons of screens of data or file
'and stop it where you want, great general programming tip!
cls
for i=2 to topN
if ffa(i)=1 then
print i,
count=count +1
if frac(count/10)=0 then print
if frac(count/200)=0 then
?:Input " ** enter s to stop display, just enter to continue **";s
if ucase(s)="S" then exit
cls
fi
fi
next
' now let's use our array for something useful besides prime numbers
label FactorNumber
?
? "Enter a number up to "+TopN+" to factor ( <2 to quit ) ";
input xn
if xn >= 2 and xn <=topN then
? xn; " factors are: ",
while ffA(xn)<>1
print ffa(xn),
xn=xn/ffa(xn)
wend
print xn
?
else
'I have learned with SmallBASIC we need to say when we are done
'because in SmallBASIC we can go back and look inside our code while
'the program is running, its nice feature but can mess you up if you
'forget the program is still running
?:? "That's all Folks!"
END
fi
goto FactorNumber
' now use this code to do your own number studies