Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
106
Task/Arithmetic-Rational/Phix/arithmetic-rational.phix
Normal file
106
Task/Arithmetic-Rational/Phix/arithmetic-rational.phix
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
without warning -- (several unused routines in this code)
|
||||
|
||||
constant NUM = 1, DEN = 2
|
||||
|
||||
type frac(object r)
|
||||
return sequence(r) and integer(r[NUM]) and integer(r[DEN]) and length(r)=2
|
||||
end type
|
||||
|
||||
function normalise(object n, atom d=0)
|
||||
atom g
|
||||
if sequence(n) then
|
||||
{n,d} = n
|
||||
end if
|
||||
if d<0 then
|
||||
n = -n
|
||||
d = -d
|
||||
end if
|
||||
g = gcd(n,d)
|
||||
return {n/g,d/g}
|
||||
end function
|
||||
|
||||
function frac_new(integer n,d=1)
|
||||
return normalise(n,d)
|
||||
end function
|
||||
|
||||
function frac_abs(frac r)
|
||||
return {abs(r[NUM]),r[DEN]}
|
||||
end function
|
||||
|
||||
function frac_inv(frac r)
|
||||
return reverse(r)
|
||||
end function
|
||||
|
||||
function frac_add(frac a, frac b)
|
||||
integer {an,ad} = a,
|
||||
{bn,bd} = b
|
||||
return normalise(an*bd+bn*ad,ad*bd)
|
||||
end function
|
||||
|
||||
function frac_sub(frac a, frac b)
|
||||
integer {an,ad} = a,
|
||||
{bn,bd} = b
|
||||
return normalise(an*bd-bn*ad,ad*bd)
|
||||
end function
|
||||
|
||||
function frac_mul(frac a, frac b)
|
||||
integer {an,ad} = a,
|
||||
{bn,bd} = b
|
||||
return normalise(an*bn,ad*bd)
|
||||
end function
|
||||
|
||||
function frac_div(frac a, frac b)
|
||||
integer {an,ad} = a,
|
||||
{bn,bd} = b
|
||||
return normalise(an*bd,ad*bn)
|
||||
end function
|
||||
|
||||
function frac_eq(frac a, frac b)
|
||||
return a==b
|
||||
end function
|
||||
|
||||
function frac_ne(frac a, frac b)
|
||||
return a!=b
|
||||
end function
|
||||
|
||||
function frac_lt(frac a, frac b)
|
||||
return frac_sub(a,b)[NUM]<0
|
||||
end function
|
||||
|
||||
function frac_gt(frac a, frac b)
|
||||
return frac_sub(a,b)[NUM]>0
|
||||
end function
|
||||
|
||||
function frac_le(frac a, frac b)
|
||||
return frac_sub(a,b)[NUM]<=0
|
||||
end function
|
||||
|
||||
function frac_ge(frac a, frac b)
|
||||
return frac_sub(a,b)[NUM]>=0
|
||||
end function
|
||||
|
||||
function is_perfect(integer num)
|
||||
frac sum = frac_new(0)
|
||||
sequence f = factors(num,1)
|
||||
for i=1 to length(f) do
|
||||
sum = frac_add(sum,frac_new(1,f[i]))
|
||||
end for
|
||||
return frac_eq(sum,frac_new(2))
|
||||
end function
|
||||
|
||||
procedure get_perfect_numbers()
|
||||
atom t0 = time()
|
||||
for i=2 to power(2,19) do
|
||||
if is_perfect(i) then
|
||||
printf(1,"perfect: %d\n",i)
|
||||
end if
|
||||
end for
|
||||
printf(1,"elapsed: %3.2f seconds\n",time()-t0)
|
||||
|
||||
integer pn5 = power(2,12)*(power(2,13)-1) -- 5th perfect number
|
||||
if is_perfect(pn5) then
|
||||
printf(1,"perfect: %d\n",pn5)
|
||||
end if
|
||||
end procedure
|
||||
|
||||
get_perfect_numbers()
|
||||
Loading…
Add table
Add a link
Reference in a new issue