Zielony Smok - logo witryny

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