前言
之前看到了一个有趣的数学问题————Broken calculator.就是给你一个损坏的计算器,只能操控$\tan()$,$\cos()$,$\sin()$,$\arctan()$,$\arcsin()$,$\arccos()$这六个函数进行嵌套,并且给定初始值1,如何得到任意正整数?(嵌套形式如下)
\[\arccos(\arcsin(\cos(\sin(\arctan(1)))))\]前置知识
我们首先需要知道两个前置公式:\(\tan(\arccos(\sin(\arctan(x))))=\frac{1}{x}\tag{1}\)\(\sin(\arctan(x))=\sqrt{\frac{x^2}{x^2+1}}\tag{2}\)
推理
假如我们需要得到的正整数为$\sqrt{q}$,那么如果我们可以得到$\sqrt{\frac{1}{q}}$,将$\sqrt{\frac{1}{q}}$带入$(1)$式就可以得到$\sqrt{q}$了,所以现在问题转化为如何得到$\sqrt{\frac{1}{q}}$,将$\sqrt{\frac{1}{q}}$带入$(2)$中,有\(\sin(\arctan(\sqrt{\frac{1}{q}}))=\sqrt{\frac{1}{1+q}}\tag{3}\)将$(3)$的$q$用$q-1$代替,我们可以得到\(\sin(\arctan(\sqrt{\frac{1}{q-1}}))=\sqrt{\frac{1}{q}}\tag{4}\)从$(4)$式我们不难看出,这是一个递归的过程,多次进行$\sin(\arctan())$,我们可以得到$\sqrt{\frac{1}{q}}$,再对其使用一次$(1)$式就可以得到结果了.
编程实现
基于上面的思想,我写了一个python程序来实现这一过程.
from math import *
List = []
## 实现式(1)
def f():
global List
List.insert(0,'atan')
List.insert(0,'sin')
List.insert(0,'acos')
List.insert(0,'tan')
## 实现式(2)
def g():
global List
List.append('sin')
List.append('atan')
## 得到存储列表
def Get_List(n):
i = 1
while(i<n*n):
g()
i=i+1
f()
## 输出结果字符串
def print_(n):
global List
Get_List(n)
string = '('.join(List)
string += '(1'
i=0
for i in range(len(List)):
string += ')'
print (string)
print_(3)