Java. Jak przygotować operator mod?

W języku Java istnieje operator dzielenia z resztą % pozwalający na wykonywanie dzielenia z resztą na typach prostych. Omówiliśmy go tutaj,
W klasie BigInteger istnieje operator remainder pozwalający na wykonanie dzielenia z resztą na liczbach typu BigInteger. Omówiliśmy go tutaj.
W klasie BigInteger istnieje operator kongruencji mod. Omówiliśmy go tutaj.
Niestety nie ma odpowiadającego mu operatora mod dla typów prostych. Powstaje pytanie: jak napisać taki operator?

metoda long mod(long dzielna, long modulus)
 /**
     * Zwraca resztę z dzielenia w znaczeniu kongruencji.
     * Różni się od % tym, że:
     * 1) nie przyjmuje ujemnego modulusa
     * 2) jeśli dzielna jest ujemna, a więc i reszta % jest ujemna zwraca resztę %
     * powiększona o modulus.
     * -10 % 3 = -1
     * mod(-10, 3) = -1 + 3 = 2
     *
     * @param dzielna - dzielna
     * @param modulus - modulnik
     * @return - zwraca resztę z dzielenia w znaczeniu kongruencji
     */
    public static long mod(long dzielna, long modulus) {
        if (modulus <= 0) {
            throw new ArithmeticException("Nieprawidłowy argument");
        }
        long i = dzielna % modulus;
        if (i < 0) {
            i = (modulus + i);
        }
        return i;
    }
Klasa MethodModTest
        long reszta1 = MathUtil.mod(10, 3);
        System.out.println(reszta1);
        long reszta2 = MathUtil.mod(-10, 3);
        System.out.println(reszta2);
        long reszta3= MathUtil.mod(9, 3);
        System.out.println(reszta3);
        long reszta4 = MathUtil.mod(-9, 3);
        System.out.println(reszta4);
        System.out.println(MathUtil.mod(3,10));
        System.out.println(MathUtil.mod(-3,10));

Po uruchomieniu klasy na konsoli zobaczymy:

1
2
0
0
3
7

Są to wyniki dokładnie identyczne z tymi, które zwraca metoda mod w klasie BigInteger.
jest to dobry punkt wyjścia do przygotowania klas i metod do pracy z kongruencjami i arytmetyką modularną.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *