免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

[数论] 编程解决一个不定方程

本帖最后由 zhcosin 于 2018-3-16 13:14 编辑

下面这个是数学解题之路公众号的题目
mmexport1521176048807.jpg
2018-3-16 12:55


我数论是渣,不过嘛,这种题目倒是适合利用计算机来搞,编程如下(scheme语言)
1.png
2018-3-16 13:03

3.png
2018-3-16 13:11


最后来求解:
$x^2+y^2+z^2=2005$
2005.png
2018-3-16 12:59

$x^2+y^2+z^2=2018$
2018.png
2018-3-16 12:59
1

评分人数

    • realnumber: 不会scheme,还是好奇想看一眼,如下在哪? ...威望 + 1
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
数学暗恋者,程序员,喜欢古典文学/历史,个人主页: https://zhcosin.coding.me/

回复 1# zhcosin
楼主如果有空,可以弄个 mathematica 来学习下

TOP

本帖最后由 zhcosin 于 2018-3-16 16:40 编辑

回复 2# isee
不会 mathematica ,我喜欢 scheme 这样的语言,它的编程过程更能揭示计算的本质,是一种享受。
具体来说,如果用 java 这样的语言,这个问题远不用这么多代码,一个三重循环就搞定了,但是这里的代码却有个有趣的地方:
将求解方程$x^2+y^2=n(x\leqslant y)$作为求解方程$x^2+y^2+z^2=n(x \leqslant y \leqslant z)$的子问题,可以看到函数 solve-sqrx-add-sqry-add-sqrz-equal-n-iter 中并没有三重循环,而是先取定$x$的值为$a$,然后解方程$y^2+z^2=n-a^2 (y \leqslant z)$,但是限定$a\leqslant y$,将它的解与$x$的值一起构成方程$x^2+y^2+z^2=n$的解,这就是编程的模块化,如果用 java 的话,很可能为了求解二元的不定方程而重新写一个二重循环来搞定,这样就看不出求解二元方程与求解三元的方程这两个问题之间的子问题关系,换句话说,代码重用性不高。这就好比制作工具,可以先制作最简单的工具,然后用最简单的工具组合出一个稍微复杂一点的工具,再用这些复杂一点的工具组合出超级复杂的工具,而不是每次都从零开始,这就是编程的艺术
1

评分人数

TOP

本帖最后由 TSC999 于 2018-3-16 22:07 编辑

用 mathematica 解答.png
2018-3-16 22:06


以上是用 mathematica 软件解不定方程的。

TOP

上面看得我一头雾水啊。大神。。

TOP

上面看得我一头雾水啊。大神。。
敬畏数学 发表于 2018-3-17 09:49

同样一头雾水,
有没有不用枚举做的?
当然“轻度”枚举还是可以的

TOP

本帖最后由 青青子衿 于 2019-4-17 16:27 编辑

回复 4# TSC999
  1. Solve[{a^2 + b^2 + c^2 == 2019 && 0 < a <= b <= c}, {a, b, c}, Integers]
复制代码
关于正整数的等幂和分解,MMA有更简洁的命令
  1. PowersRepresentations[2019, 3, 2]
复制代码

TOP

返回列表 回复 发帖