Perfect numbers: Difference between revisions
Content deleted Content added
m →{{header|Haskell}}: (minor tidying) |
No edit summary |
||
Line 1,579: | Line 1,579: | ||
return sum == x |
return sum == x |
||
end</lang> |
end</lang> |
||
=={{header|M2000 Interpreter}}== |
|||
<lang M2000 Interpreter> |
|||
Module PerfectNumbers { |
|||
Inventory Known1=2@, 3@ |
|||
IsPrime=lambda Known1 (x as decimal) -> { |
|||
=0=1 |
|||
if exist(Known1, x) then =1=1 : exit |
|||
if x<=5 OR frac(x) then {if x == 2 OR x == 3 OR x == 5 then Append Known1, x : =1=1 |
|||
Break} |
|||
if frac(x/2) else exit |
|||
if frac(x/3) else exit |
|||
x1=sqrt(x):d = 5@ |
|||
{if frac(x/d ) else exit |
|||
d += 2: if d>x1 then Append Known1, x : =1=1 : exit |
|||
if frac(x/d) else exit |
|||
d += 4: if d<= x1 else Append Known1, x : =1=1: exit |
|||
loop} |
|||
} |
|||
decompose=lambda IsPrime (n as decimal) -> { |
|||
Inventory queue Factors |
|||
{ |
|||
k=2@ |
|||
While frac(n/k)=0 { |
|||
n/=k |
|||
Append Factors, k |
|||
} |
|||
if n=1 then exit |
|||
k++ |
|||
While frac(n/k)=0 { |
|||
n/=k |
|||
Append Factors, k |
|||
} |
|||
if n=1 then exit |
|||
{ |
|||
k+=2 |
|||
while not isprime(k) {k+=2} |
|||
While frac(n/k)=0 { |
|||
n/=k |
|||
Append Factors, k |
|||
} |
|||
if n=1 then exit |
|||
loop |
|||
} |
|||
} |
|||
=Factors |
|||
} |
|||
\\ Check a perfect and a non perfect number |
|||
\\ using normal decompose to prime numbers |
|||
p=2 : n=3 : n1=2 |
|||
Document Doc$ |
|||
IsPerfect(Decompose(28), 28) |
|||
IsPerfect(Decompose(1544), 1544) |
|||
While p<32 { ' max 32 |
|||
if isprime(2^p-1@) then { |
|||
perf=(2^p-1@)*2@^(p-1@) |
|||
Rem Print perf |
|||
\\ decompose pretty fast the Perferct Numbers |
|||
\\ all have a series of 2 and last a prime equal to perf/2^(p-1) |
|||
inventory queue factors |
|||
For i=1 to p-1 { |
|||
Append factors, 2@ |
|||
} |
|||
Append factors, perf/2^(p-1) |
|||
\\ end decompose |
|||
Rem Print factors |
|||
IsPerfect(factors, Perf) |
|||
} |
|||
p++ |
|||
} |
|||
Clipboard Doc$ |
|||
\\ exit here. No need for Exit statement |
|||
Sub IsPerfect(factors, n) |
|||
local mm=each(factors,1, -2) |
|||
local z=1@, s=1@ |
|||
while mm { |
|||
z*=eval(mm) |
|||
s+=z+n/z |
|||
} |
|||
Local a$=format$("{0} is {1}perfect number", n, If$(s=n->"", "mot ")) |
|||
Doc$=a$+{ |
|||
} |
|||
Print a$ |
|||
End Sub |
|||
} |
|||
PerfectNumbers |
|||
</lang> |
|||
{{out}} |
|||
<pre style="height:30ex;overflow:scroll"> |
|||
28 is perfect number |
|||
1544 is mot perfect number |
|||
6 is perfect number |
|||
28 is perfect number |
|||
496 is perfect number |
|||
8128 is perfect number |
|||
33550336 is perfect number |
|||
8589869056 is perfect number |
|||
137438691328 is perfect number |
|||
2305843008139952128 is perfect number |
|||
</pre > |
|||
=={{header|M4}}== |
=={{header|M4}}== |