egison-4.0.2: lib/core/number.egi
--
--
-- Number
--
--
--
-- Natural Numbers
--
nat :=
matcher
| o as () with
| 0 -> [()]
| _ -> []
| s $ as nat with
| $tgt ->
match compare tgt 0 as ordering with
| greater -> [tgt - 1]
| _ -> []
| #$n as () with
| $tgt -> if tgt = n then [()] else []
| $ as (something) with
| $tgt -> [tgt]
nats :=
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100] ++
map (+ 100) nats
nats0 := 0 :: nats
odds := 1 :: map (+ 2) odds
evens := 2 :: map (+ 2) evens
fibs := [1, 1] ++ map2 (+) fibs (tail fibs)
isPrime :=
\match as integer with
| ?(< 2) -> False
| $n -> n = findFactor n
primes := 2 :: filter isPrime (drop 2 nats)
divisor n d := 0 = n % d
findFactor :=
memoizedLambda n ->
match takeWhile (<= floor (sqrt (itof n))) primes as list integer with
| _ ++ (?1#(divisor n %1) & $x) :: _ -> x
| _ -> n
primeFactorization :=
\match as integer with
| #1 -> []
| ?(< 0) & $n -> (-1) :: primeFactorization (neg n)
| $n ->
let p := findFactor n
in p :: primeFactorization (quotient n p)
pF := primeFactorization
isEven n := 0 = modulo n 2
isOdd n := 1 = modulo n 2
fact n := foldl (*) 1 [1..n]
perm n r := foldl (*) 1 [(n - (r - 1))..n]
comb n r := perm n r / fact r
nAdic n x :=
if x = 0
then []
else let q := quotient x n
r := x % n
in nAdic n q ++ [r]
--
-- Integers
--
mod m :=
matcher
| #$n as () with
| $tgt -> if modulo tgt m = modulo n m then [()] else []
| $ as (something) with
| $tgt -> [tgt]
--
-- Floats
--
exp2 x y := exp (log x * y)
--
-- Decimal Fractions
--
rtodHelper m n :=
let q := quotient (m * 10) n
r := m * 10 % n
in (q, r) :: rtodHelper r n
rtod x :=
let m := numerator x
n := denominator x
q := quotient m n
r := m % n
in (q, map fst (rtodHelper r n))
rtod' x :=
let m := numerator x
n := denominator x
q := quotient m n
r := m % n
(s, c) := findCycle (rtodHelper r n)
in (q, map fst s, map fst c)
showDecimal c x :=
match 2#(%1, take c %2) (rtod x) as (integer, list integer) with
| ($q, $sc) -> foldl S.append (S.append (show q) ".") (map show sc)
showDecimal' x :=
match rtod' x as (integer, list integer, list integer) with
| ($q, $s, $c) ->
foldl
S.append
""
(S.append (show q) "." :: map show s ++ " " :: map show c ++ [" ..."])
--
-- Continued Fraction
--
regularContinuedFraction n xs := n + foldr (\a r -> 1 / (a + r)) 0 xs
continuedFraction n xs ys :=
match (xs, ys) as (list integer, list integer) with
| ($x :: $xs, $y :: $ys) -> n + y / continuedFraction x xs ys
| ([], []) -> n
regularContinuedFractionOfSqrtHelper m a b :=
let n := floor (f.+ (rtof a) (f.* (rtof b) (sqrt (rtof m))))
x := m - power n 2
in if x = 0
then [(a, b, n)]
else let y := power (n - a) 2 - b * b * m
in (a, b, n) :: regularContinuedFractionOfSqrtHelper
m
((a - n) / y)
(neg (b / y))
regularContinuedFractionOfSqrt m :=
let n := floor (sqrt (rtof m))
x := m - power n 2
in if x = 0
then (n, [])
else ( n
, map 3#%3 (regularContinuedFractionOfSqrtHelper m (n / x) (1 / x)) )
regularContinuedFractionOfSqrt' m :=
let n := floor (sqrt (rtof m))
x := m - power n 2
in if x = 0
then (n, [], [])
else let (s, c) := findCycle
(regularContinuedFractionOfSqrtHelper
m
(n / x)
(1 / x))
in (n, map 3#%3 s, map 3#%3 c)
pi := f.pi