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
|
|
@ -0,0 +1,8 @@
|
|||
(lib 'math)
|
||||
math.lib v1.10 ® EchoLisp
|
||||
Lib: math.lib loaded.
|
||||
|
||||
(crt-solve '(2 3 2) '(3 5 7))
|
||||
→ 23
|
||||
(crt-solve '(2 3 2) '(7 1005 15))
|
||||
💥 error: mod[i] must be co-primes : assertion failed : 1005
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import integers.modinv
|
||||
|
||||
def crt( congruences ) =
|
||||
N = product( n | (_, n) <- congruences )
|
||||
sum( a*modinv(N/n, n)*N/n | (a, n) <- congruences ) mod N
|
||||
|
||||
println( crt([(2, 3), (3, 5), (2, 7)]) )
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
proc mulInv(a0, b0): int =
|
||||
var (a, b, x0) = (a0, b0, 0)
|
||||
result = 1
|
||||
if b == 1: return
|
||||
while a > 1:
|
||||
let q = a div b
|
||||
a = a mod b
|
||||
swap a, b
|
||||
result = result - q * x0
|
||||
swap x0, result
|
||||
if result < 0: result += b0
|
||||
|
||||
proc chineseRemainder[T](n, a: T): int =
|
||||
var prod = 1
|
||||
var sum = 0
|
||||
for x in n: prod *= x
|
||||
|
||||
for i in 0 .. <n.len:
|
||||
let p = prod div n[i]
|
||||
sum += a[i] * mulInv(p, n[i]) * p
|
||||
|
||||
sum mod prod
|
||||
|
||||
echo chineseRemainder([3,5,7], [2,3,2])
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
func mul_inv(a, b) {
|
||||
b == 1 && return 1;
|
||||
var (b0, x0, x1) = (0, 0, 1);
|
||||
while (a > 1) {
|
||||
(a, b, x0, x1) = (b, a % b, x1 - x0*int(a / b), x0);
|
||||
};
|
||||
x1 < 0 ? x1+b0 : x1;
|
||||
}
|
||||
|
||||
func chinese_remainder(*n) {
|
||||
var N = n«*»;
|
||||
func (*a) {
|
||||
n.range.map { |i|
|
||||
var p = int(N / n[i]);
|
||||
a[i] * mul_inv(p, n[i]) * p;
|
||||
}.sum
|
||||
}
|
||||
}
|
||||
|
||||
say chinese_remainder(3, 5, 7)(2, 3, 2);
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
# mul_inv(a;b) returns x where (a * x) % b == 1, or else null
|
||||
def mul_inv(a; b):
|
||||
|
||||
# state: [a, b, x0, x1]
|
||||
def iterate:
|
||||
.[0] as $a | .[1] as $b
|
||||
| if $a > 1 then
|
||||
if $b == 0 then null
|
||||
else ($a / $b | floor) as $q
|
||||
| [$b, ($a % $b), (.[3] - ($q * .[2])), .[2]] | iterate
|
||||
end
|
||||
else .
|
||||
end ;
|
||||
|
||||
if (b == 1) then 1
|
||||
else [a,b,0,1] | iterate
|
||||
| if . == null then .
|
||||
else .[3] | if . < 0 then . + b else . end
|
||||
end
|
||||
end;
|
||||
|
||||
def chinese_remainder(mods; remainders):
|
||||
(reduce mods[] as $i (1; . * $i)) as $prod
|
||||
| reduce range(0; mods|length) as $i
|
||||
(0;
|
||||
($prod/mods[$i]) as $p
|
||||
| mul_inv($p; mods[$i]) as $mi
|
||||
| if $mi == null then error("nogo: p=\($p) mods[\($i)]=\(mods[$i])")
|
||||
else . + (remainders[$i] * $mi * $p)
|
||||
end )
|
||||
| . % $prod ;
|
||||
Loading…
Add table
Add a link
Reference in a new issue