如果要组成序对,car和cdr返回的a和b值必须唯一,题目可以理解为,如果一个整数由2^a 和 3^b表示,那么a和b的值肯定是唯一的。
我们可以利用反证法证明这个命题,证明过程如下
设
有
两
组
值
a
1
、
b
1
和
a
2
、
b
2
都
能
组
成
整
数
N
,
且
a
1
≠
a
2
、
b
1
≠
b
2
则
N
=
2
a
1
∗
3
b
1
N
=
2
a
2
∗
3
b
2
2
a
1
∗
3
b
1
=
2
a
2
∗
3
b
2
2
a
1
−
a
2
=
3
b
2
−
b
1
如
果
2
n
次
方
和
3
m
次
方
能
相
等
,
则
n
=
m
=
0
则
a
1
−
a
2
=
b
2
−
b
1
=
0
所
以
a
1
=
a
2
b
1
=
b
2
这
与
假
设
a
1
≠
a
2
、
b
1
≠
b
2
矛
盾
,
所
以
命
题
成
立
设有两组值a_1、b_1和a_2、b_2都能组成整数N,且a_1\neq a_2、b_1\neq b_2则\\ N=2^{a_1}*3^{b_1}\\ N=2^{a_2}*3^{b_2}\\ 2^{a_1}*3^{b_1}=2^{a_2}*3^{b_2}\\ 2^{a_1-a_2}=3^{b_2-b_1}\\ 如果2^n次方和3^m次方能相等,则n=m=0\\ 则a_1-a_2=b_2-b_1=0\\ 所以a_1=a_2\\ b_1=b_2\\ 这与假设a_1\neq a_2、b_1\neq b_2矛盾,所以命题成立
设有两组值a1、b1和a2、b2都能组成整数N,且a1=a2、b1=b2则N=2a1∗3b1N=2a2∗3b22a1∗3b1=2a2∗3b22a1−a2=3b2−b1如果2n次方和3m次方能相等,则n=m=0则a1−a2=b2−b1=0所以a1=a2b1=b2这与假设a1=a2、b1=b2矛盾,所以命题成立
这个其实是算数基本定理的一个特例。
算数基本定理是:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积
N
=
P
1
a
1
∗
P
2
a
2
∗
P
3
a
3
.
.
.
.
.
.
∗
P
n
a
n
,
N=P1^{a_1}*P2^{a_2}*P3^{a_3}......*Pn^{a_n},
N=P1a1∗P2a2∗P3a3......∗Pnan,
这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。证明过程大家自己去搜索把。
给出最终过程
(define (cons a b)
(* (expt 2 a) (expt 3 b)))
(define (car n)
(define (iter a)
(if (= (remainder n (expt 2 a)) 0) (iter (+ a 1)) (- a 1)))
(iter 1))
(define (cdr n)
(define (iter b)
(if (= (remainder n (expt 3 b)) 0) (iter (+ b 1)) (- b 1)))
(iter 1))
(car (cons 5 6))
(cdr (cons 4 10))
运算结果
5
10
当然car、cdr也可以用一次一次的除2或者3来计数实现,那种可能更合理点,毕竟按照之前题目的要求,在计算过程中,不断地缩小运算参数的大小,会提高程序的运行效率和降低运算程序所需的空间。