# N-th Root ###### tags: `Math` ## How did i came up with this topic :question: I have read about ancient people struggled to calculate the number $\sqrt[12]{2}$ needed for all the half steps in 12 equal temperament in musical tuning. And this raise my attention one day. Because, as we know, ancient people **DO** knew how to calculate square root and cube root and this is enough for that. ## The old way ### Let us first implement this idea with Newton\'s Method in python:exclamation: ### First we have to explain what is Newton\'s Method It is a method to approximate square root of a positive number, despite called Newton's Method, the method predates him by thousands of years ## Assume we want to approximate the number $\sqrt{m}$ 1. Make a guess $k$ 2. Divide $m$ with guess $k$ to the desired precision 3. Calculating the estimate by taking the average between your guess k and the result from **step 2** to the desired precision 4. Go back to **step 2** and use the previous estimate as your new guess until the new estimate do not change to the previous estimate ### Now I will add an example so the explanation so it is clearer ### Try to Estimate $\sqrt{2}$ with 3 digits after decimal point 1. Guess $1.000$ 2. Divide $2$ with guess $1.000$, which is $\frac{2}{1}=2.000$ 3. Calculate the average between the guess $1$ and **step 2's result** $2$, which is $\frac{1+2.000}{2} = 1.500$ as estimate In the next few loops the new estimate will be $1.416, 1.414,1.414$ and we get our estimate of $1.414$ ## There are also a more generalized method to calculate any $\sqrt[n]{m}$ 1. Make a guess $k$ 2. Divide $m$ with guess $k^{n-1}$ to the desired precision 3. Calculating the estimate by taking the weighed average, which is $\frac{k× (n-1) + \frac{x}{m^{n-1} }}{n}$ with your guess k and the result from **step 2** to the desired precision 4. Go back to **step 2** and use the previous estimate as your new guess until the new estimate do not change >Description rewrote from [here](https://www.calculator.net/root-calculator.html) ## With these knowledge\, we can *finally* write the following code in python ```python= # i is the desired precision, default to the thousandth digit def estimate_newton(n:int, m, i:int = 3): MAXLOOP = 500 val = 1 # first crude estimate acc = 0 # to keep in track of loops while True: newval = np.round(m / val**(n-1),i) newval = np.round((val*(n-1) + newval)/n,i) acc += 1 diff = abs(val - newval) if acc > MAXLOOP: print(f'Exceed Maximum Number of Loops') return if diff == 0: return newval else: val = newval ``` ## So... how many steps to calculate with hand\? It took 5 loops to calculate $\sqrt[12]{2}\approx1.059463$ Within these 5 loops you will have to: 1. multiply the estimate by 11 times and divide the number $m$ once 2. times the estimate to a number and do a minus and a plus, and then do a division 3. compare to the previous result(zero work) :::success So that's **60** multiplications, **10** divisions and **10** additions (subtraction is just addition with sign changed) in the most optimized route, which is not impossible. Just need some extra time I guess. ::: ### Okay this is enough, but I am curious about its capabilities :::danger When i tried to run this with larger numbers I got ::: ```text! OverflowError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_13736\879349673.py in <module> ----> 1 estimate_newton(100,123456789012345,3) ~\AppData\Local\Temp\ipykernel_13736\3503608325.py in estimate_newton(n, m, i) 5 6 while 1: ----> 7 newval = round(m / val**(n-1),i) 8 newval = round((val*(n-1) + newval)/n,i) 9 acc += 1 OverflowError: (34, 'Result too large') ``` Which showed the following problem: 1. When $k^{n-1}$ term in **step 2** is becoming too large the convergent of the number series is slow when it comes to larger n and m 2. like $\sqrt[100]{12345}$ took a whopping **474** loops to run - - - ## A better idea ... or Not ⁉️ ### Power of logarithm Since n\-th root of a number can be generalized as power of m to the reciprocal of n, we can derive the following equation: $$\sqrt[n]{m} = m^{\frac{1}{n}} = e^{\ln{m^{\frac{1}{n}}}} = e^{\frac{\ln{m}}{n}}$$ Now the $\ln{m}$ in $e^{\frac{\color{red}\ln{\color{red}m}}{n}}$ should be calculated first, in this case, most human will compute this with a log table as Taylor series of log convergent **very slowly**. Although CPUs have many ways to implement this based on their architecture, but log tables are, surprisingly quite commonly used like this [reference code](https://svnweb.freebsd.org/base/head/lib/msun/src/s_exp2.c?view=markup&pathrev=251024). And there's a whole rabbit hole to discover we will skip this for today. **Anyways**, Is this a cheat or not? I would left for reader's own judgement. Alright, after $\frac{\ln{m}}{n}$ is calculated, we can calculate the real answer $e^\frac{\ln{m}}{n}$ with Taylor expansion, given the following formula: :::info $$ e^{x} = \sum\limits_{n=0}^\infty{\frac{x^{n}}{n!}} = 1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\ldots$$ ::: #### *way* better Since $\ln{m}$ means it can deal with a much larger $m$ than the $k^{n-1}$ term in the Newton's Method before the *OverflowError* and the converge of the number series is guaranteed by the factorial growth in the denominator ## With these knowledge\, we can write the similar following code in python ```python= # i is the desired precision, default to the thousandth digit def estimate_euler(n:int, m, i:int = 3): MAXLOOP = 500 x = np.log(m)/n #math.log() works, too fac = 1 acc = 0 sol = 0 while 1: newtern = round(x**acc / fac, i) if abs(newtern) <= 0.5*10**(-i): return sol if acc > MAXLOOP: print(f'Exceed Maximum Number of Loops') sol += newtern fac *= acc+1 acc += 1 ``` > The python module of numpy or math is needed for both round and log function :::success Which could accurately estimate the test case of $\sqrt[100]{123456789012345}\approx1.383296$ ::: With the same parameter given, only 4 loops are needed to calculate $\sqrt[100]{12345}$ - - - ## Summary Alright, Let us sort all the previous results into a table for a straightforward comparison: | Name | Big Numbers | Don't Use Log Table | Fewer Steps | Easy to Understand | | -------------------- | ----------- | ----------------- | ---------------- | ------------------ | | Newton's method | :x: | :o: | :x: | :o: | | Log+Taylor expansion | :o: | :x:† | :o:‡ | :wavy_dash: | <font color=gray> †it's quick though<br/> ‡kinda like a cheat </font> note revised in 2023/Feb/16 for extra info in logarithm and the Newton's method