
Arytmetyka modularna (Java)
Jak przygotować operator mod dla typów prymitywnych – wyjaśniłam tutaj.
Teraz przygotujemy metody pozwalające wykonywać działania modularne.
Dodawanie modularne
public static long modAdd(long a, long b, long modulus) {
return mod(Math.addExact(a, b), modulus);
}
Odejmowanie modularne
public static long modSub(long a, long b, long modulus) {
return mod(Math.subtractExact(a, b), modulus);
}
Mnożenie modularne
public static long modMult(long a, long b, long modulus) {
return mod(Math.multiplyExact(a, b), modulus);
}
Potęgowanie modularne
public static long powExact(long a, long exp) {
if (exp < 0) {
throw new ArithmeticException("Wykładnik mniejszy od 0");
}
long w = 1L;
while (exp > 0) {
if ((exp & 1) == 1) {
w = Math.multiplyExact(w, Math.multiplyExact(w, a));
} else {
w = Math.multiplyExact(w, w);
}
exp >>= 1;
}
return w;
}
public static long modPow(long a, long exp, long modulus) {
return mod(powExact(a, exp), modulus);
}
Testy
Dodajemy 10 mod 24 + 4 mod 24.
Wynik: 14 mod 24
Odejmujemy 14 mod 24 – 16 mod 24.
Wynik: 22 mod 24
Mnożymy 10 mod 24 × 3 mod 24.
Otrzymujemy 6 mod 24.
Potęgujemy (10 mod 24)3 mod 24.
Wynik: 16 mod 24
Po uruchomieniu klasy ModMain:
long r1 = ModUtil.modAdd(10, 4, 24);
System.out.println(r1);
long r2 = ModUtil.modSub(14,16, 24);
System.out.println(r2);
long r3 = ModUtil.modMult(10, 3, 24);
System.out.println(r3);
long r4 = ModUtil.modPow(10, 3, 24);
System.out.println(r4);
na konsoli zobaczymy:
14 22 6 16
Klasa CongruenceTestMod2
long m = 24L;
long hour = 5;
System.out.println("Jest godzina: 5 mod 24 = " + ModUtil.mod(5, 24) + " mod 24");
System.out.println("Dodajemy 14 godzin:");
System.out.println("Jest godzina: modAdd(5, 14, 24) = " + ModUtil.modAdd(5, 14, 24) + " mod 24");
System.out.println("Mnożymy zegar przez 3 mod 24");
System.out.println("Jest godzina modMult(3, 19, 24) = " + ModUtil.modMult(3,19,24)+ " mod 24");
//-
long num = -125;
long pow = 3;
System.out.println(ModUtil.powExact(num, pow));
System.out.println((long)Math.pow(num,pow));
//-
System.out.println("Podnosimy zegar do potęgi modPow(9, 4, 24)");
System.out.println("Jest godzina modPow(9, 4, 24) = "+ModUtil.modPow(9,4,24));
Po uruchomieniu – na konsoli otrzymujemy:
Jest godzina: 5 mod 24 = 5 mod 24 Dodajemy 14 godzin: Jest godzina: modAdd(5, 14, 24) = 19 mod 24 Mnożymy zegar przez 3 mod 24 Jest godzina modMult(3, 19, 24) = 9 mod 24 -1953125 -1953125 Podnosimy zegar do potęgi modPow(9, 4, 24) Jest godzina modPow(9, 4, 24) = 9
