Re: [问题] 求最小整数解

楼主: LPH66 (-6.2598534e+18f)   2014-06-04 02:58:39
※ 引述《sweetycool (tina)》之铭言:
: 已知 a,b,c,d皆为正整数
: a+b=c+d
: 1/13 = ac/bd
: 令s=a+b+c+d
: 求min s ?
: ans: 170
: 想问一下这题有办法跑出来吗?感恩
嗯,虽然数学版已经有人回说答案不对了,不过还是来跑一下
顺便介绍几个函式
首先是本题 (合并成一行之后的) 程式
Catch[
Do[
If[Length[#] != 0, Throw[Append[#, n]]] &[
Position[Outer[Times, #, #], 1/13] &[
Table[a/(n - a), {a, 1, n - 1}]
]
], {n, 1, 85}
]; {{}, -1}
]
以下由内而外解说
最内层是一个 Table,里面列出分子分母的和是固定值 n 的所有分数
主要是看到条件里的 ac/bd 可以看成 (a/b)*(c/d)
而这两个分数由于有 a+b = c+d 的条件,分子分母的和是相同的
所以就先列出所有这些分数
外面一层是 Position 包 Outer,还有一个纯函式的代值
先讲纯函式代值,这招我很常用在 one-liner 里取代重复的东西
基本模式是一个纯函式 ...& 后面马上用 [] 代值进去
用处是在当我要运算的式子里有重复的东西时可以只写一次
这一层的函式是 Position[Outer[Times, #, #], 1/13]&,代的值是内层的 Table
其实这跟先把内层收进变量里再重复运用变量是一样的
也就是这里相当于
list = Table[...]
Position[Outer[Times, list, list], 1/13]
再来讲 Outer,这个是广义外积,简单说明即是:
Outer[f, {a, b}, {x, y, z}] 会得到
{{f[a, x], f[a, y], f[a, z]}, {f[b, x], f[b, y], f[b, z]}}
于是在这里 Outer[Times, list, list] 就会列出所有 list 里任意两个元素的乘积
这正好是我要寻找 1/13 的对象,因此就用 Position 去找出 1/13 在哪里了
再外一层也是纯函式代值,函式是
If[Length[#] != 0, Throw[Append[#, n]]]&
代的值是内层 Position 的结果
由于 Position 在找不到东西时回传的是 {}
而找到东西时回传的则是 {{位置一座标}, {位置二座标}, ...}
因此判断它的长度是不是 0,如果不是的话就表示找到东西了
就在这个结果后面塞进 n 值之后 Throw 出来
这里要讲解的是 Throw / Catch 这一对函式
(jurian0101 在 #1JTHjnoX 有提过, 这里再多讲解一点)
这一对函式是属于外包内结构,Catch 在外,Throw 在内
执行 Catch 时会先执行它的参数
如果这当中碰到 Throw 被执行了,则 Catch 的参数执行就到此中断
Catch 的结果就是刚刚执行的 Throw 的参数
否则 (当中都没有执行到 Throw) 则是参数执行结果
这例子中的 Catch 是在最外层
也就是说只要找到东西之后就会马上停止计算,把结果丢出来给最外层
反之如果没找到则继续计算
再往外一层是一个 Do,这就只是很简单的让 n 从 1 开始试而已
上界填一个足够大的数就好,这里填 85 的原因是因为原 PO 贴的答案是 170 的关系
(不能填 Infinity,它会说这不能跑 XD)
当然万一跑完范围都找不到我们需要一个方式知道才行
因此分号后面就是 Do 跑完之后要执行的东西
如果真的跑到那里的话会得到 {{}, -1} 这东西
然后因为这中间都没碰到 Throw,所以外面的 Catch 得到的结果就会是这个
(其实不用摆也行, 因为 Do 的执行结果永远是 Null,
只要跑完了却没有结果就是找不到)
最外层就是收答案用的 Catch 了
执行结果得到
{{1, 7}, {7, 1}, 14}
这表示在 n = 14 时,那个 Outer 的大阵列里的 {1, 7} 及 {7, 1} 两个位置是 1/13
但那个 Outer 阵列的元素是由内层的 Table 乘起来的
它的 {1, 7} 位置就是内层 Table 第一个元素跟第七个元素相乘的结果
而内层 Table 的第 a 个元素是分子为 a, 分子分母和为 n 的分数
因此从这个结果我们就能读出 1/13 跟 7/7 的乘积是 1/13
也就是所求最小 s 的 (a, b, c, d) 是 (1, 13, 7, 7)

Links booklink

Contact Us: admin [ a t ] ucptt.com