WebMoney-WMSigner
view release on metacpan or search on metacpan
rsalib1.cpp view on Meta::CPAN
return(precision);
} while (--precision);
return(precision);
}
void CRSALib::unitfill0(unitptr r,word16 unitcount)
{
while (unitcount--) *r++ = 0;
}
int CRSALib::mp_udiv(register unitptr remainder,register unitptr quotient,
register unitptr dividend,register unitptr divisor)
{
int bits;
short dprec;
register unit bitmask;
if (( ((*(divisor))==(0)) && (significance(divisor)<=1) ))
return(-1);
mp_init(remainder,0);
mp_init(quotient,0);
{
dprec = significance(dividend);
if (!dprec) return(0);
bits = ((dprec) << 4);
(dividend) = ((dividend)+(dprec)-1);
bitmask = ((unit) 0x8000);
while (!(*(dividend) & bitmask))
{
bitmask >>= 1;
bits--;
}
};
(quotient) = ((quotient)+(dprec)-1);
while (bits--)
{
mp_rotate_left(remainder,(boolean)((*(dividend) & bitmask)!=0));
if (mp_compare(remainder,divisor) >= 0)
{
mp_subb(remainder,divisor,(boolean)0);
*(quotient) |= bitmask;
}
{
if (!(bitmask >>= 1))
{
bitmask = ((unit) 0x8000);
((dividend)--); ((quotient)--);
}
};
}
return(0);
}
int CRSALib::mp_div(register unitptr remainder,register unitptr quotient,
register unitptr dividend,register unitptr divisor)
{
boolean dvdsign,dsign;
int status;
dvdsign = (((signedunit) (*((dividend)+(global_precision)-1)) < 0)!=0);
dsign = (((signedunit) (*((divisor)+(global_precision)-1)) < 0)!=0);
if (dvdsign) mp_neg(dividend);
if (dsign) mp_neg(divisor);
status = mp_udiv(remainder,quotient,dividend,divisor);
if (dvdsign) mp_neg(dividend);
if (dsign) mp_neg(divisor);
if (status<0) return(status);
if (dvdsign) mp_neg(remainder);
if (dvdsign ^ dsign) mp_neg(quotient);
return(status);
}
word16 CRSALib::mp_shortdiv(register unitptr quotient,
register unitptr dividend,register word16 divisor)
{
int bits;
short dprec;
register unit bitmask;
register word16 remainder;
if (!divisor)
return(-1);
remainder=0;
mp_init(quotient,0);
{
dprec = significance(dividend);
if (!dprec) return(0);
bits = ((dprec) << 4);
(dividend) = ((dividend)+(dprec)-1);
bitmask = ((unit) 0x8000);
while (!(*(dividend) & bitmask))
{
bitmask >>= 1;
bits--;
}
};
(quotient) = ((quotient)+(dprec)-1);
while (bits--)
{
remainder <<= 1;
if ((*(dividend) & bitmask))
remainder++;
if (remainder >= divisor)
{
remainder -= divisor;
*(quotient) |= bitmask;
}
{
if (!(bitmask >>= 1))
{
bitmask = ((unit) 0x8000);
((dividend)--);
((quotient)--);
}
};
}
return(remainder);
}
int CRSALib::mp_mod(register unitptr remainder,
register unitptr dividend,register unitptr divisor)
{
int bits;
short dprec;
register unit bitmask;
( run in 1.719 second using v1.01-cache-2.11-cpan-71847e10f99 )