clear

// 巴雷特模乘原理

a       dup4866 )
b       dup4855 )
m       dup4836 )

// 要求a * b mod m
// 先计算a * b
ab      big_mul$a$b )

// 求m的位数
k       getbit_length$m )
// 缩小一点,然后放大,要求0x10^(k-1)<=m<0x10^k
k       div$k04 )
k       sub$k01 )

base    shl01int0x$k * 4 ) )

while $base < $m
    
base    shl$base04 )
    
k       add$k01 )
loop

bk      shl$baseint0x$k * 4 ) )

u       big_div$bk$m )

// 去低位
t       shr$abint( ( ( 0x$k - 1 ) * 4 ) ) )

// 乘以u
t       big_mul$t$u )

// 右移取整
t       shr$tint( ( ( 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$r00 )

test    big_mod_mul$a$b$m )

if $test != $r
    
?
    
pause
endif

end

int a = 0x1234;
int b = 0x41;
int k = getkb );
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 );

whiler >= b )
    
{
    r
 -= b;
    
}