60 lines
1.3 KiB
Text
60 lines
1.3 KiB
Text
*process source xref;
|
|
ami: Proc Options(main);
|
|
p9a=time();
|
|
Dcl (p9a,p9b,p9c) Pic'(9)9';
|
|
Dcl sumpd(20000) Bin Fixed(31);
|
|
Dcl pd(300) Bin Fixed(31);
|
|
Dcl npd Bin Fixed(31);
|
|
Dcl (x,y) Bin Fixed(31);
|
|
|
|
Do x=1 To 20000;
|
|
Call proper_divisors(x,pd,npd);
|
|
sumpd(x)=sum(pd,npd);
|
|
End;
|
|
p9b=time();
|
|
Put Edit('sum(pd) computed in',(p9b-p9a)/1000,' seconds elapsed')
|
|
(Skip,col(7),a,f(6,3),a);
|
|
|
|
Do x=1 To 20000;
|
|
Do y=x+1 To 20000;
|
|
If y=sumpd(x) &
|
|
x=sumpd(y) Then
|
|
Put Edit(x,y,' found after ',elapsed(),' seconds')
|
|
(Skip,2(f(6)),a,f(6,3),a);
|
|
End;
|
|
End;
|
|
Put Edit(elapsed(),' seconds total search time')(Skip,f(6,3),a);
|
|
|
|
proper_divisors: Proc(n,pd,npd);
|
|
Dcl (n,pd(300),npd) Bin Fixed(31);
|
|
Dcl (d,delta) Bin Fixed(31);
|
|
npd=0;
|
|
If n>1 Then Do;
|
|
If mod(n,2)=1 Then /* odd number */
|
|
delta=2;
|
|
Else /* even number */
|
|
delta=1;
|
|
Do d=1 To n/2 By delta;
|
|
If mod(n,d)=0 Then Do;
|
|
npd+=1;
|
|
pd(npd)=d;
|
|
End;
|
|
End;
|
|
End;
|
|
End;
|
|
|
|
sum: Proc(pd,npd) Returns(Bin Fixed(31));
|
|
Dcl (pd(300),npd) Bin Fixed(31);
|
|
Dcl sum Bin Fixed(31) Init(0);
|
|
Dcl i Bin Fixed(31);
|
|
Do i=1 To npd;
|
|
sum+=pd(i);
|
|
End;
|
|
Return(sum);
|
|
End;
|
|
|
|
elapsed: Proc Returns(Dec Fixed(6,3));
|
|
p9c=time();
|
|
Return((p9c-p9b)/1000);
|
|
End;
|
|
End;
|