clear
// 巴雷特模乘原理
a = dup( 48, 66 )
b = dup( 48, 55 )
m = dup( 48, 36 )
// 要求a * b mod m
// 先计算a * b
ab = big_mul( $a, $b )
// 求m的位数
k = getbit_length( $m )
// 缩小一点,然后放大,要求0x10^(k-1)<=m<0x10^k
k = div( $k, 04 )
k = sub( $k, 01 )
base = shl( 01, int( 0x$k * 4 ) )
while $base < $m
base = shl( $base, 04 )
k = add( $k, 01 )
loop
bk = shl( $base, int( 0x$k * 4 ) )
u = big_div( $bk, $m )
// 去低位
t = shr( $ab, int( ( ( 0x$k - 1 ) * 4 ) ) )
// 乘以u
t = big_mul( $t, $u )
// 右移取整
t = shr( $t, int( ( ( 0x$k + 1 ) * 4 ) ) )
t = big_mul( $t, $m )
r = big_sub( $ab, $t )
while $r >= $m
r = big_sub( $r, $m )
loop
r = big_add( $r, 00 )
test = big_mod_mul( $a, $b, $m )
if $test != $r
?
pause
endif
end
int a = 0x1234;
int b = 0x41;
int k = getk( b );
int bk = 1 << ( 2 * k );
int u = bk / b;
// 去低位
int t = (a >> (k - 1));
// 乘u
t *= u;
// 右移取整
t >>= ( k + 1 );
int r = a - ( t * b );
while( r >= b )
{
r -= b;
}