Montgomery reduction: Difference between revisions
m
→{{header|Phix}}: replaced with gmp version
m (→{{header|Phix}}: replaced with gmp version) |
|||
Line 779:
=={{header|Phix}}==
{{trans|D}}
{{libheader|mpfr}}
<lang Phix>include
while bi_compare(v,0)!=0 do▼
{v,?} = bi_div3(v, 2)▼
enum BASE, BITLEN, MODULUS, RRM
function reduce(sequence mont,
integer n = mont[BITLEN]
r = mpz_init_set(a)
for i=1 to n do
if
end if
{
end for
if
return
end function
function Montgomery(
if
if
integer n =
mpz_powm_ui(rrm,rrm,n*2,m)
return {2, -- BASE
n, -- BITLEN
Line 818 ⟶ 811:
end function
t1 = mpz_init(),
t2 = mpz_init()
sequence mont = Montgomery(m)
mpz_ui_pow_ui(r,2,mont[BITLEN])
printf(1,"b : %d\n", {mont[BASE]})
printf(1,"n : %d\n", {mont[BITLEN]})
printf(1,"r : %s\n", {
printf(1,"m : %s\n", {
printf(1,"t1: %s\n", {
printf(1,"t2: %s\n", {
printf(1,"r1: %s\n", {
printf(1,"r2: %s\n", {
printf(1,"\n")
printf(1,"Original x1 : %s\n", {
printf(1,"Recovered from r1 : %s\n", {
printf(1,"Original x2 : %s\n", {
printf(1,"Recovered from r2 : %s\n", {
printf(1,"\nMontgomery computation of x1 ^ x2 mod m :")
mpz base = reduce(mont,r),
if bi_mod(expn,2)=BI_ONE then -- odd▼
prod = reduce(mont,bi_mul(prod,base))▼
mpz_mul(prod,prod,base)
end if
{
mpz_mul(base
end while
printf(1,"%s\n",{
printf(1,"
mpz_powm(r,x1,x2,m)
printf(1,"%s\n",{
{{out}}
<pre>
|