Вот реализация алгоритма Карацубы на Java:
import java.math.BigInteger;
public class KaratsubaAlgorithm {
public static BigInteger karatsuba(BigInteger x, BigInteger y) {
int n = Math.max(x.bitLength(), y.bitLength());
// Base case for recursion
if (n <= 2000) {
return x.multiply(y);
}
n = (n / 2) + (n % 2);
// Splitting the numbers
BigInteger b = x.shiftRight(n);
BigInteger a = x.subtract(b.shiftLeft(n));
BigInteger d = y.shiftRight(n);
BigInteger c = y.subtract(d.shiftLeft(n));
// Recursive steps
BigInteger ac = karatsuba(a, c);
BigInteger bd = karatsuba(b, d);
BigInteger abcd = karatsuba(a.add(b), c.add(d));
return ac.add(abcd.subtract(ac).subtract(bd).shiftLeft(n)).add(bd.shiftLeft(2 * n));
}
public static void main(String[] args) {
BigInteger x = new BigInteger("123456789");
BigInteger y = new BigInteger("987654321");
BigInteger result = karatsuba(x, y);
System.out.println("Result: " + result);
}
}
В этой реализации метод karatsuba()принимает два входных параметра BigInteger: xи y, а возвращает свой продукт, используя алгоритм Карацубы. Алгоритм рекурсивно разбивает числа пополам, пока они не достигнут определенного размера, а затем выполняет умножение по формуле, полученной из алгоритма.
Для проверки реализации метод main()демонстрирует пример использования путем умножения двух чисел BigInteger, xи y.и распечатываем результат.