Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,26 +0,0 @@
|
|||
with Ada.Text_IO, Ada.Command_Line, Crypto.Types.Big_Numbers;
|
||||
|
||||
procedure Mod_Exp is
|
||||
|
||||
A: String :=
|
||||
"2988348162058574136915891421498819466320163312926952423791023078876139";
|
||||
B: String :=
|
||||
"2351399303373464486466122544523690094744975233415544072992656881240319";
|
||||
|
||||
D: constant Positive := Positive'Max(Positive'Max(A'Length, B'Length), 40);
|
||||
-- the number of decimals to store A, B, and result
|
||||
Bits: constant Positive := (34*D)/10;
|
||||
-- (slightly more than) the number of bits to store A, B, and result
|
||||
package LN is new Crypto.Types.Big_Numbers (Bits + (32 - Bits mod 32));
|
||||
-- the actual number of bits has to be a multiple of 32
|
||||
use type LN.Big_Unsigned;
|
||||
|
||||
function "+"(S: String) return LN.Big_Unsigned
|
||||
renames LN.Utils.To_Big_Unsigned;
|
||||
|
||||
M: LN.Big_Unsigned := (+"10") ** (+"40");
|
||||
|
||||
begin
|
||||
Ada.Text_IO.Put("A**B (mod 10**40) = ");
|
||||
Ada.Text_IO.Put_Line(LN.Utils.To_String(LN.Mod_Utils.Pow((+A), (+B), M)));
|
||||
end Mod_Exp;
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
(let ((a "2988348162058574136915891421498819466320163312926952423791023078876139")
|
||||
(b "2351399303373464486466122544523690094744975233415544072992656881240319"))
|
||||
;; "$ ^ $$ mod (10 ^ 40)" performs modular exponentiation.
|
||||
;; "unpack(-5, x)_1" unpacks the integer from the modulo form.
|
||||
(message "%s" (calc-eval "unpack(-5, $ ^ $$ mod (10 ^ 40))_1" nil a b)))
|
||||
|
|
@ -1,18 +1,19 @@
|
|||
import bigints
|
||||
|
||||
proc powmod(b, e, m: BigInt): BigInt =
|
||||
assert e >= 0
|
||||
assert e >= 0'bi
|
||||
var e = e
|
||||
var b = b
|
||||
let t = 2'bi
|
||||
result = initBigInt(1)
|
||||
while e > 0:
|
||||
if e mod 2 == 1:
|
||||
while e > 0'bi:
|
||||
if e mod t == 1'bi:
|
||||
result = (result * b) mod m
|
||||
e = e div 2
|
||||
e = e div t
|
||||
b = (b.pow 2) mod m
|
||||
|
||||
var
|
||||
a = initBigInt("2988348162058574136915891421498819466320163312926952423791023078876139")
|
||||
b = initBigInt("2351399303373464486466122544523690094744975233415544072992656881240319")
|
||||
|
||||
echo powmod(a, b, 10.pow 40)
|
||||
echo powmod(a, b, 10'bi.pow 40)
|
||||
|
|
|
|||
|
|
@ -1,35 +1,33 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">mpz_mod_exp</span><span style="color: #0000FF;">(</span><span style="color: #004080;">mpz</span> <span style="color: #000000;">base</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">exponent</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">modulus</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mpz_cmp_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">exponent</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">base</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">_exp</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init_set</span><span style="color: #0000FF;">(</span><span style="color: #000000;">exponent</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (use a copy)</span>
|
||||
<span style="color: #004080;">bool</span> <span style="color: #000000;">odd</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_odd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">odd</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_sub_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #7060A8;">mpz_fdiv_q_2exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">mpz_mod_exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">modulus</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">_exp</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">_exp</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">odd</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">mpz_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">base</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #7060A8;">mpz_mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">modulus</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
with javascript_semantics
|
||||
include mpfr.e
|
||||
procedure mpz_mod_exp(mpz base, exponent, modulus, result)
|
||||
if mpz_cmp_si(exponent,1)=0 then
|
||||
mpz_set(result,base)
|
||||
else
|
||||
mpz exp_copy = mpz_init_set(exponent)
|
||||
bool bOdd = mpz_odd(exp_copy)
|
||||
if bOdd then
|
||||
mpz_sub_ui(exp_copy,exp_copy,1)
|
||||
end if
|
||||
mpz_fdiv_q_2exp(exp_copy,exp_copy,1)
|
||||
mpz_mod_exp(base,exp_copy,modulus,result)
|
||||
exp_copy = mpz_free(exp_copy)
|
||||
mpz_mul(result,result,result)
|
||||
if bOdd then
|
||||
mpz_mul(result,result,base)
|
||||
end if
|
||||
end if
|
||||
mpz_mod(result,result,modulus)
|
||||
end procedure
|
||||
|
||||
<span style="color: #004080;">mpz</span> <span style="color: #000000;">base</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"2988348162058574136915891421498819466320163312926952423791023078876139"</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">exponent</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"2351399303373464486466122544523690094744975233415544072992656881240319"</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">modulus</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1"</span><span style="color: #0000FF;">&</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'0'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">40</span><span style="color: #0000FF;">)),</span>
|
||||
<span style="color: #000000;">result</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">()</span>
|
||||
mpz base = mpz_init("2988348162058574136915891421498819466320163312926952423791023078876139"),
|
||||
exponent = mpz_init("2351399303373464486466122544523690094744975233415544072992656881240319"),
|
||||
modulus = mpz_init("1e40"),
|
||||
result = mpz_init()
|
||||
|
||||
<span style="color: #000000;">mpz_mod_exp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">exponent</span><span style="color: #0000FF;">,</span><span style="color: #000000;">modulus</span><span style="color: #0000FF;">,</span><span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
mpz_mod_exp(base,exponent,modulus,result)
|
||||
?mpz_get_str(result)
|
||||
|
||||
<span style="color: #000080;font-style:italic;">-- check against the builtin:</span>
|
||||
<span style="color: #7060A8;">mpz_powm</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">,</span><span style="color: #000000;">base</span><span style="color: #0000FF;">,</span><span style="color: #000000;">exponent</span><span style="color: #0000FF;">,</span><span style="color: #000000;">modulus</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">result</span><span style="color: #0000FF;">)</span>
|
||||
<!--
|
||||
-- check against the builtin:
|
||||
mpz_powm(result,base,exponent,modulus)
|
||||
?mpz_get_str(result)
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
Function Invoke-ModuloExponentiation ([BigInt]$Base, [BigInt]$Exponent, $Modulo) {
|
||||
$Result = 1
|
||||
$Base = $Base % $Modulo
|
||||
If ($Base -eq 0) {return 0}
|
||||
|
||||
While ($Exponent -gt 0) {
|
||||
If (($Exponent -band 1) -eq 1) {$Result = ($Result * $Base) % $Modulo}
|
||||
$Exponent = $Exponent -shr 1
|
||||
$Base = ($Base * $Base) % $Modulo
|
||||
}
|
||||
return ($Result % $Modulo)
|
||||
}
|
||||
|
||||
$a = [BigInt]::Parse('2988348162058574136915891421498819466320163312926952423791023078876139')
|
||||
$b = [BigInt]::Parse('2351399303373464486466122544523690094744975233415544072992656881240319')
|
||||
$m = [BigInt]::Pow(10, 40)
|
||||
|
||||
Invoke-ModuloExponentiation -Base $a -Exponent $b -Modulo $m
|
||||
Loading…
Add table
Add a link
Reference in a new issue