mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-04-21 05:07:35 +00:00
Solution for the Euler Project Problem 122 (#12655)
* Add initial version for euler project problem 122. * Add doctests and documentation for the project euler problem 122. * Update sol1.py * Update sol1.py * Update sol1.py * Update sol1.py * Update sol1.py * Update sol1.py * Update sol1.py --------- Co-authored-by: Maxim Smolskiy <mithridatus@mail.ru>
This commit is contained in:
parent
cc621f1fdd
commit
d123cbc649
0
project_euler/problem_122/__init__.py
Normal file
0
project_euler/problem_122/__init__.py
Normal file
89
project_euler/problem_122/sol1.py
Normal file
89
project_euler/problem_122/sol1.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
"""
|
||||||
|
Project Euler Problem 122: https://projecteuler.net/problem=122
|
||||||
|
|
||||||
|
Efficient Exponentiation
|
||||||
|
|
||||||
|
The most naive way of computing n^15 requires fourteen multiplications:
|
||||||
|
|
||||||
|
n x n x ... x n = n^15.
|
||||||
|
|
||||||
|
But using a "binary" method you can compute it in six multiplications:
|
||||||
|
|
||||||
|
n x n = n^2
|
||||||
|
n^2 x n^2 = n^4
|
||||||
|
n^4 x n^4 = n^8
|
||||||
|
n^8 x n^4 = n^12
|
||||||
|
n^12 x n^2 = n^14
|
||||||
|
n^14 x n = n^15
|
||||||
|
|
||||||
|
However it is yet possible to compute it in only five multiplications:
|
||||||
|
|
||||||
|
n x n = n^2
|
||||||
|
n^2 x n = n^3
|
||||||
|
n^3 x n^3 = n^6
|
||||||
|
n^6 x n^6 = n^12
|
||||||
|
n^12 x n^3 = n^15
|
||||||
|
|
||||||
|
We shall define m(k) to be the minimum number of multiplications to compute n^k;
|
||||||
|
for example m(15) = 5.
|
||||||
|
|
||||||
|
Find sum_{k = 1}^200 m(k).
|
||||||
|
|
||||||
|
It uses the fact that for rather small n, applicable for this problem, the solution
|
||||||
|
for each number can be formed by increasing the largest element.
|
||||||
|
|
||||||
|
References:
|
||||||
|
- https://en.wikipedia.org/wiki/Addition_chain
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def solve(nums: list[int], goal: int, depth: int) -> bool:
|
||||||
|
"""
|
||||||
|
Checks if nums can have a sum equal to goal, given that length of nums does
|
||||||
|
not exceed depth.
|
||||||
|
|
||||||
|
>>> solve([1], 2, 2)
|
||||||
|
True
|
||||||
|
>>> solve([1], 2, 0)
|
||||||
|
False
|
||||||
|
"""
|
||||||
|
if len(nums) > depth:
|
||||||
|
return False
|
||||||
|
for el in nums:
|
||||||
|
if el + nums[-1] == goal:
|
||||||
|
return True
|
||||||
|
nums.append(el + nums[-1])
|
||||||
|
if solve(nums=nums, goal=goal, depth=depth):
|
||||||
|
return True
|
||||||
|
del nums[-1]
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def solution(n: int = 200) -> int:
|
||||||
|
"""
|
||||||
|
Calculates sum of smallest number of multiplactions for each number up to
|
||||||
|
and including n.
|
||||||
|
|
||||||
|
>>> solution(1)
|
||||||
|
0
|
||||||
|
>>> solution(2)
|
||||||
|
1
|
||||||
|
>>> solution(14)
|
||||||
|
45
|
||||||
|
>>> solution(15)
|
||||||
|
50
|
||||||
|
"""
|
||||||
|
total = 0
|
||||||
|
for i in range(2, n + 1):
|
||||||
|
max_length = 0
|
||||||
|
while True:
|
||||||
|
nums = [1]
|
||||||
|
max_length += 1
|
||||||
|
if solve(nums=nums, goal=i, depth=max_length):
|
||||||
|
break
|
||||||
|
total += max_length
|
||||||
|
return total
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(f"{solution() = }")
|
Loading…
x
Reference in New Issue
Block a user