Montgomery reduction: Difference between revisions

→‎{{header|Quackery}}: multiple improvements
(Added Quackery.)
(→‎{{header|Quackery}}: multiple improvements)
Line 1,476:
=={{header|Quackery}}==
 
{{trans|Factor}}
<syntaxhighlight lang="Quackery"> [ 0 swap
[ dup while
dip 1+
1 >> again ]
drop ] is bits ( n --> n )
 
<code>**mod</code> is defined at [[Modular exponentiation#Quackery]].
[ over bits times
[ dup 1 & if
[ over + ]
1 >> ]
swap mod ] is monred ( n n --> n )
 
<syntaxhighlight lang="Quackery"> [ 0 swap [ dup while dip 1+ 1 >> again ] drop ] is bits ( n --> n )
$ "750791094644726559640638407699 440160025148131680164261562101 monred"
 
dup echo$ say " --> " quackery echo cr
[ 1 & ] is odd ( n --> b )
$ "750791094644726559640638407699 435362628198191204145287283255 monred"
 
dup echo$ say " --> " quackery echo cr </syntaxhighlight>
[ over bits times [ dup odd if [ over + ] 1 >> ] swap mod ] is monred ( n n --> n )
 
[ 750791094644726559640638407699 ] is m ( --> n )
[ 323165824550862327179367294465482435542970161392400401329100 ] is t1 ( --> n )
 
[ 440160025148131680164261562101 ] is r1 ( --> n )
[ 435362628198191204145287283255 ] is r2 ( --> n )
 
[ 540019781128412936473322405310 ] is x1 ( --> n )
[ 515692107665463680305819378593 ] is x2 ( --> n )
 
[ unrot dip
[ dip 1+dup
over t1 rot / monred temp put
1t1 >>monred ]
[ dup 0 != while
[ dup 1 &odd if
[ over +temp take ]*
m swap monred
temp put ]
dip [ dup * m swap monred ]
1 >> again ]
2drop temp take monred ] is **mon ( n n n --> n )
 
say "Original x1: " x1 echo cr
say "Recovered from r1: " m r1 monred echo cr
cr
say "Original x2: " x2 echo cr
say "Recovered from r2: " m r2 monred echo cr
cr
say "Montgomery computation of x1^x2 mod m: " x1 x2 m **mon echo cr
say "Modular exponentiation of x1^x2 mod m: " x1 x2 m **mod echo cr
</syntaxhighlight>
 
{{out}}
 
<pre>750791094644726559640638407699Original x1: 440160025148131680164261562101 monred --> 540019781128412936473322405310
Recovered from r1: 540019781128412936473322405310
750791094644726559640638407699 435362628198191204145287283255 monred --> 515692107665463680305819378593
 
</pre>
Original x2: 515692107665463680305819378593
Recovered from r2: 515692107665463680305819378593
 
Montgomery computation of x1^x2 mod m: 151232511393500655853002423778
Modular exponentiation of x1^x2 mod m: 151232511393500655853002423778</pre>
 
=={{header|Racket}}==
1,462

edits