/*
Copyright (C) 2015 William Hart
Copyright (C) 2015 Fredrik Johansson
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
#define ulong ulongxx /* interferes with system includes */
#include
#undef ulong
#include "flint.h"
#include "ulong_extras.h"
mp_limb_t
n_cbrt_binary_search(mp_limb_t x)
{
mp_limb_t low, high, mid, p, upper_limit;
/* upper_limit is the max cube root possible for one word */
#ifdef FLINT64
upper_limit = 2642245; /* 2642245 < (2^64)^(1/3) */
#else
upper_limit = 1625; /* 1625 < (2^32)^(1/3) */
#endif
low = 0;
high = UWORD(1) << ((FLINT_BIT_COUNT(x) + 2) / 3);
if (high > upper_limit) /* cube cannot be greater than upper_limit */
high = upper_limit;
/* binary search for cube root */
while (low < high)
{
mid = (high + low) / 2;
p = mid + 1;
p = p * p * p;
if (p == x)
return mid + 1;
else if (p > x)
high = mid;
else
low = mid + 1;
}
return low;
}