Fermat's Factorization method for large numbers - GeeksforGeeks

17 Apr, 2020
Given a large number N, the task is to divide this number into a product of two factors, using Fermat’s Factorisation method.
Examples
Input: N = 105327569Output: 10223, 10303
Input: N = 249803Output: 23, 10861
Fermat Factorization: Fermat’s Factorization method is based on the representation of an odd integer as the difference of two squares.For an integer N, we want a and b such as:
N = a2 - b2 = (a+b)(a-b) 

where (a+b) and (a-b) are 
the factors of the number N.

Approach:
Get the number as an object of BigInteger classFind the square root of N.It is guaranteed that the value of a is greater than sqrt(N) and value of b less than sqrt(N).Take the value of sqrt(n) as a and increment the number until and unless a number b is found such that N – a^2 is a perfect square.
Get the number as an object of BigInteger class
Find the square root of N.
It is guaranteed that the value of a is greater than sqrt(N) and value of b less than sqrt(N).
Take the value of sqrt(n) as a and increment the number until and unless a number b is found such that N – a^2 is a perfect square.
Below is the implementation of the above approach:
// Java program for Fermat's Factorization// method for large numbers  import java.math.*;import java.util.*;  class Solution {      // Function to find the Floor    // of square root of a number    public static BigInteger sqrtF(BigInteger x)        throws IllegalArgumentException    {        // if x is less than 0        if (x.compareTo(BigInteger.ZERO) < 0) {            throw new IllegalArgumentException(                "Negative argument.");        }          // if x==0 or x==1        if (x.equals(BigInteger.ZERO)            || x.equals(BigInteger.ONE)) {            return x;        }          BigInteger two            = BigInteger.valueOf(2L);        BigInteger y;          // run a loop        y = x.divide(two);        while (y.compareTo(x.divide(y)) > 0)            y = ((x.divide(y)).add(y))                    .divide(two);        return y;    }      // function to find the Ceil    // of square root of a number    public static BigInteger sqrtC(BigInteger x)        throws IllegalArgumentException    {        BigInteger y = sqrtF(x);          if (x.compareTo(y.multiply(y)) == 0) {            return y;        }          else {            return y.add(BigInteger.ONE);        }    }      // Fermat factorisation    static String FermatFactors(BigInteger n)    {        // constants        BigInteger ONE = new BigInteger("1");        BigInteger ZERO = new BigInteger("0");        BigInteger TWO = new BigInteger("2");          // if n%2 ==0 then return the factors        if (n.mod(TWO).equals(ZERO)) {            return n.divide(TWO)                       .toString()                + ", 2";        }          // find the square root        BigInteger a = sqrtC(n);          // if the number is a perfect square        if (a.multiply(a).equals(n)) {            return a.toString()                + ", " + a.toString();        }          // else perform factorisation        BigInteger b;        while (true) {            BigInteger b1 = a.multiply(a)                                .subtract(n);            b = sqrtF(b1);              if (b.multiply(b).equals(b1))                break;            else                a = a.add(ONE);        }          return a.subtract(b).toString()            + ", " + a.add(b).toString();    }      // Driver code    public static void main(String args[])    {        String N = "105327569";          System.out.println(            FermatFactors(                new BigInteger(N)));    }}
10223, 10303

Performance Analysis:
Time Complexity: O(sqrt(N))
Space Complexity: O(1)
factor
Java-BigInteger
large-numbers
Java Programs
Mathematical
Write From Home
Java-BigInteger
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
How to Iterate HashMap in Java?
Iterate through List in Java
Factory method design pattern in Java
Java program to count the occurrence of each character in a string using Hashmap
Java Program to Remove Duplicate Elements From the Array
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7