
Operator mod w klasie BigInteger
Operator mod jest operatorem kongruencji związanym z arytmetyką modularną. Więcej o kongruencjach powiem w jednym z najbliższych wpisów.
BigInteger mod(BigInteger m)
result ≡ this (mod m)
m oznacza modulus w znaczeniu kongruencji.
Jeśli m ≤ 0 metoda wyrzuca ArithmeticException
W przeciwieństwie do metody remainder mod zwraca zawsze liczbę nie ujemną (czyli 0 albo liczbę dodatnią)
reszta = this (mod m) jeśli reszta - this jest podzielna przez m
1 ≡ 10 (mod 3) bo 1-10=-9 jest podzielne przez 3
2 ≡ -10 (mod 3) bo 2-(-10)=12 jest podzielne przez 3, ale 1-(-10)=11 nie byłoby podzielne przez 3. Jak widzimy wyniki te odbiegają od wyników zwracanych przez metodę remainder.
Zwróćmy uwagę na sposób liczenia:
remainder(-10,3) = -1
mod(-10,3) = -1 + 3 = 2 (gdy dzielna jest ujemna do reszty dodawany jet modulus!)>/
Liczby względnie pierwsze
Liczby względnie pierwsze (a, b) to liczby, których największy wspólny dzielnik nwd(a, b) = 1 czyli gdy (a.gcd(b)).equals(BigInteger.ONE).
BigInteger modInverse(BigInteger m)
result ≡ this-1 (mod m)
m oznacza modulus w znaczeniu kongruencji
Jeśli m ≤ 0 metoda wyrzuca ArithmeticException
Jeśli this nie jest względnie pierwsze z m metoda wyrzuca ArithmeticException
1 ≡ 1/10 (mod 3), gdyż 1-1/10=9/10 jest podzielne przez 3
BigInteger modPower(BigInteger exponent, BigInteger m)
result ≡ thisexponent (mod m)
m oznacza modulus w znaczeniu kongruencji
Jeśli m ≤ 0 metoda wyrzuca ArithmeticException
Jeśli this nie jest względnie pierwsze z m metoda wyrzuca ArithmeticException
W przeciwieństwie do metody BigInteger pow(int exponent) tutaj exponent może być ujemny.
1 ≡ 105 (mod 3), gdyż 1-100000=99999, jest podzielne przez 3.
1 ≡ 10-5 (mod 3), gdyż 1-1/100000=99999/100000 jest podzielne przez 3.
Pzykłady
Klasa BigInt12.java
package java_math_biginteger; import java.math.*; public class BigInt12 { public static void main(String[] args) { BigInteger dzielna1 = new BigInteger("10"); BigInteger dzielna2 = new BigInteger("-10"); BigInteger dzielnik1 = new BigInteger("3"); //- BigInteger reszta1 = dzielna1.mod(dzielnik1); Util.print(reszta1); BigInteger reszta2 = dzielna2.mod(dzielnik1); Util.print(reszta2); //- boolean b = (dzielna1.gcd(dzielnik1)).equals(BigInteger.ONE); if(b) { BigInteger modi = dzielna1.modInverse(dzielnik1); Util.print(modi); } if(b){ BigInteger exp = new BigInteger("5"); BigInteger modp = dzielna1.modPow(exp, dzielnik1); Util.print(modp); BigInteger exp1 = new BigInteger("-5"); BigInteger modp1 = dzielna1.modPow(exp1, dzielnik1); Util.print(modp1); } } }
Po uruchomieniu otrzymujemy na konsoli:
1 2 1 1 1
