记录一个有趣的数学问题

用三角函数嵌套得到任意一个正整数

 Von's Blog     2020-01-28   1268 words    & views

前言

之前看到了一个有趣的数学问题————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)

参考文章

reddit的文章
氯化钡和硫酸银的博客