Ask Your Question

Revision history [back]

It seems log(int(n), 2) fails for a specific set of values of n.

Take n of the form 2^a * (k * 2^b + 1) where a + b = 32, 2 <= a <= 30, k >= 1.

Then log(int(n), 2) incorrectly returns a.

The smallest instance would be for 2^2 * (2^30 + 1) ie 4294967300.

Yes, this is a bug.

It seems log(int(n), 2) fails for a specific set of values of n.

Take n of the form 2^a * (k * 2^b + 1) where a + b = 32, 2 <= a <= 30, k >= 1.

Then log(int(n), 2) incorrectly returns a.

The smallest instance would be for 2^2 * (2^30 + 1) ie 4294967300.

Similar past bug: https://github.com/sagemath/sage/issues/25979.

Yes, this is a bug.

It seems log(int(n), 2) fails for a specific set of values of n.

Take n of the form 2^a * (k * 2^b + 1) where a + b = 32, a, b, k with 2 <= a <= 30, a + b = 32, k >= 1.

Then log(int(n), log(int(2^a * (k * 2^b + 1)), 2) incorrectly returns a.

The smallest instance would be for Smallest case: 2^2 * (2^30 + 1) ie 4294967300.

If n is an int, calling log(n, 2) calls logb(n, 2).

So the following illustrates the bug for each (a, b) and the first few k.

sage: from sage.functions.log import logb
sage: n_py = lambda a, b: int(2)**a * int(b)
sage: n_zz = lambda a, b: ZZ(2)**a * ZZ(b)
sage: f_py = lambda a, b: logb(n_py(a, b), 2)
sage: f_zz = lambda a, b: logb(n_zz(a, b), 2)
sage: mismatch = lambda a, b: f_py(a, b) != f_zz(a, b)
sage: aa = range(2, 31)
sage: kk = range(1, 4)
sage: ab = [(a, k * c + 1) for a in aa for c in [2**(32 - a)] for k in kk)
sage: all(mismatch(a, b) for a, b in ab)
True
sage: min((2**a * b, (a, b)) for a, b in ab)
(4294967300, (2, 1073741825))

Similar past bug: https://trac.sagemath.org/ticket/25979/,
moved to
https://github.com/sagemath/sage/issues/25979.

Yes, this is a bug.

It seems log(int(n), 2) fails for a specific set of values of n.

Take a, b, k with 2 <= a <= 30, a + b = 32, k >= 1.

Then log(int(2^a * (k * 2^b + 1)), 2) incorrectly returns a.

Smallest case: 2^2 * (2^30 + 1) ie 4294967300.

If n is an int, calling log(n, 2) calls logb(n, 2).

So the following illustrates the bug for each (a, b) and the first few k.

sage: from sage.functions.log import logb
sage: n_py = lambda a, b: int(2)**a * int(b)
sage: n_zz = lambda a, b: ZZ(2)**a * ZZ(b)
sage: f_py = lambda a, b: logb(n_py(a, b), 2)
sage: f_zz = lambda a, b: logb(n_zz(a, b), 2)
sage: mismatch = lambda a, b: f_py(a, b) != f_zz(a, b)
sage: aa = range(2, 31)
sage: kk = range(1, 4)
sage: ab = [(a, k * c + 1) for a in aa for c in [2**(32 - a)] for k in kk)
sage: all(mismatch(a, b) for a, b in ab)
True
sage: min((2**a * b, (a, b)) for a, b in ab)
(4294967300, (2, 1073741825))

Similar past bug: https://trac.sagemath.org/ticket/25979/,
moved to https://github.com/sagemath/sage/issues/25979.

Edit. The logb function in sage.functions.log calls Ginac's log which lives in the file src/sage/symbolic/ginac/inifcns_trans.cpp currently at

Yes, this is a bug.

It seems log(int(n), 2) fails for a specific set of values of n.

Take a, b, k with 2 <= a <= 30, a + b = 32, k >= 1.

Then log(int(2^a * (k * 2^b + 1)), 2) incorrectly returns a.

Smallest case: 2^2 * (2^30 + 1) ie 4294967300.

If n is an int, calling log(n, 2) calls logb(n, 2).

So the following illustrates the bug for each (a, b) and the first few k.

sage: from sage.functions.log import logb
sage: n_py = lambda a, b: int(2)**a * int(b)
sage: n_zz = lambda a, b: ZZ(2)**a * ZZ(b)
sage: f_py = lambda a, b: logb(n_py(a, b), 2)
sage: f_zz = lambda a, b: logb(n_zz(a, b), 2)
sage: mismatch = lambda a, b: f_py(a, b) != f_zz(a, b)
sage: aa = range(2, 31)
sage: kk = range(1, 4)
sage: ab = [(a, k * c + 1) for a in aa for c in [2**(32 - a)] for k in kk)
sage: all(mismatch(a, b) for a, b in ab)
True
sage: min((2**a * b, (a, b)) for a, b in ab)
(4294967300, (2, 1073741825))

Similar past bug: https://trac.sagemath.org/ticket/25979/,
moved to https://github.com/sagemath/sage/issues/25979.

Edit. The logb function in sage.functions.log calls Ginac's log which lives in . Not sure whether it is the file one in src/sage/symbolic/ginac/numeric.cpp or src/sage/symbolic/ginac/inifcns_trans.cpp currently at, see