Chinese remainder theorem: Difference between revisions
Content added Content deleted
(Added Wren) |
|||
Line 2,634: | Line 2,634: | ||
23 = 3 (mod 5) |
23 = 3 (mod 5) |
||
23 = 2 (mod 7)</pre> |
23 = 2 (mod 7)</pre> |
||
=={{header|Wren}}== |
|||
{{trans|C}} |
|||
<lang ecmascript>/* returns x where (a * x) % b == 1 */ |
|||
var mulInv = Fn.new { |a, b| |
|||
if (b == 1) return 1 |
|||
var b0 = b |
|||
var x0 = 0 |
|||
var x1 = 1 |
|||
while (a > 1) { |
|||
var q = (a/b).floor |
|||
var t = b |
|||
b = a % b |
|||
a = t |
|||
t = x0 |
|||
x0 = x1 - q*x0 |
|||
x1 = t |
|||
} |
|||
if (x1 < 0) x1 = x1 + b0 |
|||
return x1 |
|||
} |
|||
var chineseRemainder = Fn.new { |n, a| |
|||
var prod = n.reduce { |acc, i| acc * i } |
|||
var sum = 0 |
|||
for (i in 0...n.count) { |
|||
var p = (prod/n[i]).floor |
|||
sum = sum + a[i]*mulInv.call(p, n[i])*p |
|||
} |
|||
return sum % prod |
|||
} |
|||
var n = [3, 5, 7] |
|||
var a = [2, 3, 2] |
|||
System.print(chineseRemainder.call(n, a))</lang> |
|||
{{out}} |
|||
<pre> |
|||
23 |
|||
</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |