RosettaCodeData/Task/Almost-prime/Phix/almost-prime-2.phix
2016-12-05 23:44:36 +01:00

44 lines
1.1 KiB
Text

function kprime(integer n, integer k)
--
-- returns true if n has exactly k factors
--
-- p is a "pseudo prime" in that 2,3,4,5,6,7,8,9,10,11 will behave
-- exactly like 2,3,5,7,11, ie the remainder(n,4)=0 (etc) will never
-- succeed because remainder(n,2) would have succeeded twice first.
-- Hence for larger n consider replacing p+=1 with p=next_prime(),
-- then again, on "" this performs an obscene number of divisions..
--
integer p = 2,
factors = 0
while factors<k and p*p<=n do
while remainder(n,p)=0 do
n = n/p
factors += 1
end while
p += 1
end while
factors += (n>1)
return factors==k
end function
procedure almost_primeC()
integer nextkprime, count
for k=1 to 5 do
printf(1,"k = %d: ", k);
nextkprime = 2
count = 0
while count<10 do
if kprime(nextkprime, k) then
printf(1," %4d", nextkprime)
count += 1
end if
nextkprime += 1
end while
puts(1,"\n")
end for
if getc(0) then end if
end procedure
almost_primeC()