Logarithm to base 3 in python

567 Views Asked by At

I am trying to find the logarithm of a number to base 3 using python.

Here is the problem :

https://leetcode.com/problems/power-of-three/description/

I am using this code:

import math
math.log(k,3)

However, it is failing for some test cases like (there are some more test cases):

math.log(243,3)

#output
4.999999999999999

math.log(59049,3)

#output
9.999999999999998

I do not want to use round() as it will round other numbers which are not the powers of 3.

Here is the full code which I am using:

class Solution:
    def isPowerOfThree(self, n: int) -> bool:
        import math
        k = abs(n)
        if n<=0:
            return False
        return math.log(k,3) == int(math.log(k,3))

Note: I am looking for solutions involving logarithms. Please feel free to ask for any clarifications.

2

There are 2 best solutions below

1
dan04 On BEST ANSWER

This is just typical floating-point error. Recall that when you write math.log(x, 3), Python is actually calculating something like math.log(x) / math.log(3), with both (natural) log calculations and the division having to be rounded to the nearest float.

But if you do your math with int instead of float, exactness is preserved.

def is_power_of_three(n):
    if n <= 0:
        return False
    while n > 1:
        n, r = divmod(n, 3)
        if r != 0:
            return False
    return n == 1

This checks if you can divide n by 3 (without remainder) until the result is 1.

0
eNeM On

If you still want an answer that uses logarithms. You can use the following code.

def isPowerOfThree(self, n: int) -> bool:
    return n > 0 and n == 3**round(math.log(n, 3))

LeetCode Solution