Class PollardRhoBrentMontgomery64


  • public class PollardRhoBrentMontgomery64
    extends FactorAlgorithm
    Brents's improvement of Pollard's Rho algorithm using Montgomery multiplication. The main reason why Montgomery multiplication is helpful for Pollard-Rho is that no conversions to/from Montgomery form are required. In this implementation I managed to use the Montgomery reducer R=2^64, which simplifies the Montgomery multiplication a good deal. Another small performance improvement stems from using the polynomial x*(x+1) instead of x^2+c, which saves us the addition modulo N after each Montgomery multiplication.
    Author:
    Tilman Neumann
    • Constructor Detail

      • PollardRhoBrentMontgomery64

        public PollardRhoBrentMontgomery64()
    • Method Detail

      • getName

        public String getName()
        Specified by:
        getName in class FactorAlgorithm
        Returns:
        The name of the algorithm, possibly including important parameters.
      • findSingleFactor

        public long findSingleFactor​(long N)
      • montMul64

        public static long montMul64​(long a,
                                     long b,
                                     long N,
                                     long Nhat)
        Montgomery multiplication of a*b mod n. ("mulredcx" in Yafu)
        Parameters:
        a -
        b -
        N -
        Nhat - complement of N mod 2^64
        Returns:
        Montgomery multiplication of a*b mod n
      • main

        public static void main​(String[] args)
        Test. Test numbers: 3225275494496681 (52 bits) = 56791489 * 56791529 322527333642009919 (59 bits) = 567914891 * 567914909 3225273260887418687 (62 bits) = 567914891 * 5679148957
        Parameters:
        args - ignored