/* Copyright (C) 2015 Kushagra Singh This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include "flint.h" #include "fmpz.h" #include "ulong_extras.h" int main(void) { fmpz_t prime1, prime2, prime3, prime4, primeprod, fac, modval, maxa, maxy, a, y; int i, j, k, fails; FLINT_TEST_INIT(state); fmpz_init(prime1); fmpz_init(prime2); fmpz_init(prime3); fmpz_init(prime4); fmpz_init(primeprod); fmpz_init(fac); fmpz_init(modval); fmpz_init(a); fmpz_init(y); fmpz_init(maxa); fmpz_init(maxy); fails = 0; flint_printf("pollard_brent_single...."); fflush(stdout); for (i = 5; i < 36 && i <= FLINT_BITS; i += 5) { mp_limb_t maxiter = UWORD(1) << FLINT_MIN(i, FLINT_BITS - 1); for (j = 0; j < 10 * flint_test_multiplier(); j++) { fmpz_set_ui(prime1, n_randprime(state, i, 1)); fmpz_set_ui(prime2, n_randprime(state, i, 1)); fmpz_set_ui(prime3, n_randprime(state, i, 1)); fmpz_set_ui(prime4, n_randprime(state, i, 1)); fmpz_mul(prime1, prime1, prime2); fmpz_mul(prime3, prime3, prime4); fmpz_mul(primeprod, prime1, prime3); /* Assigning random values of y and a */ fmpz_sub_ui(maxa, primeprod, 3); fmpz_randm(a, state, maxa); fmpz_add_ui(a, a, 1); /* 1 <= a <= n - 3 */ fmpz_sub_ui(maxa, primeprod, 1); fmpz_randm(y, state, primeprod); fmpz_add_ui(y, y, 1); /* 1 <= y <= n - 1 */ k = fmpz_factor_pollard_brent_single(fac, primeprod, y, a, maxiter); if (k == 0) fails += 1; else { fmpz_mod(modval, primeprod, fac); k = fmpz_cmp_ui(modval, 0); if (k != 0) { printf("FAIL : Wrong factor calculated\n"); printf("n : "); fmpz_print(primeprod); printf(" factor calculated : "); fmpz_print(fac); abort(); } } } } if (fails > flint_test_multiplier()) { printf("FAIL : Pollard Rho failed too many times (%d times)\n", fails); abort(); } FLINT_TEST_CLEANUP(state); fmpz_clear(prime1); fmpz_clear(prime2); fmpz_clear(prime3); fmpz_clear(prime4); fmpz_clear(primeprod); fmpz_clear(fac); fmpz_clear(modval); fmpz_clear(a); fmpz_clear(y); fmpz_clear(maxa); fmpz_clear(maxy); flint_printf("PASS\n"); return 0; }