
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ą.
