https://metacpan.org/pod/Math :: BigInt # Arithmeti c -методы : "Эти методы изменяют объект invocand и возвращают его." Другими словами, bmod
, bsub
и badd
подобны %=
, -=
и +=
, не похожи на %
, -
и +
.
Поэтому везде, где вы вызываете один из методов арифметики c, вы должны сначала скопировать, чтобы объект, для которого вы в данный момент вызываете метод, не изменился:
use Math::BigInt;
Math::BigInt->accuracy(60);
Math::BigInt->precision(60);
my $orig = Math::BigInt->new('5967920747812842369477355441'); # A
my $divisor = Math::BigInt->new('719'); # B
my $modulo = $orig->copy->bmod($divisor); # A % B = M
my $diff = $divisor->copy->bsub($modulo); # B - M = D
my $new = $orig->copy->badd($diff); # A + D = N
my $test = $new->copy->bmod($divisor); # N % B = 0
print("orig : $orig\n"); # 10; should be: 5967920747812842369477355441
print("modulo : $modulo\n"); # 10; should be: 648
print("diff : $diff\n"); # 71; should be: 71
print("new : $new\n"); # 10; should be: 5967920747812842369477355512
print("test : $test\n"); # 10; should be: 0
(Также изменился ваш тест делать модуль, а не деление.)