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 ArithmeticExceptio
n
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