Jak przygotować operator mod? (Java)
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ą.