Sowya 使用教程

  Sowya(原名Calculator)是一款运行于 Windows 系统上的计算程序. 支持大数运算(四则运算、模运算、阶乘等)、分数运算、进制转换、变量定义、不定方程求解等. 矩阵运算也在加入中.

  程序文件为 Sowya.exe 和 SowyaApp.exe (v0.550前的是 calculator.exe 和 CalculatorApp.exe). 前者是控制台应用软件, 后者是其 GUI 版本. 这两个文件均可在 atzjg.net 首页上下载.

  若非特别指明, 以下都使用 Sowya 指代 Sowya.exe 或之前的 calculator.exe 和 CalculatorApp.exe.

  版本记号: v0.xxx 表示0.xxx 版本. 可用命令显示当前软件的版本.

  注: (1) 自v0.550开始, Calculator更名为Sowya. (2) Sowya 即吴语中“数学”的“拼音”. 可以到 cn.bing.com/translator 中输入Sowya并聆听发音.

  此项目开始于2018年11月24日. 可以在命令窗口中输入 :dev_history 并回车, 列出开发历史.

  数学 首页有下载. 或直接点击下面的链接.

  Sowya.7z (控制台应用 Sowya.exe 及GUI版本程序 SowyaApp.exe, 最新版本 v0.562)

  请使用 7zip 解压缩.

  Calculator中的命令均以冒号(:)开头, 例如 :version, 用于显示软件的当前版本号.

  指令功能:help显示基本的帮助信息:h同 :help:more显示更多功能:dev_history显示开发历史:clc清除Result和Trace窗口中的内容:thanks显示“欢迎使用Calculator”:aboutCalculator 简介:exit退出程序, calculator.exe 中有用.:quit同 :exit:q同 :quit:version显示软件当前的版本号:mode :mode clox显示当前计算模式, 详细用法可以输入 :mode x 查看.进入编程模式, 使用 clox 语言. 或将显示函数的基本信息, 功能等同于. 这里是指函数名.

  在命令窗口(Command)中输入 (5 + 2) * 3 / 7 然后回车, 将在输出窗口(Result)中得到结果

  例1. 计算(\frac{1}{3}+\frac{1}{5})^2(\frac{1}{3}+\frac{1}{5})^{-2} .

  例2. 计算 (-\frac{1}{3})^{3/2}(-\frac{1}{3})^{-3/2}

  对于 (-\frac{1}{3})^{-3/2} , 计算结果暂时未进行化简.

  手动化简

  因此, 结果是 -5.19615242i . 在后面讲计算模式时, 我们会提到分数计算模式. 若要切换到分数计算模式, 则使用命令.

  这里表示 \sqrt[n]{x} . 即 (-\frac{1}{3})^{3/2}=\frac{i}{3\sqrt{3}} , (-\frac{1}{3})^{-3/2}=3\sqrt{3}i .

  例, 计算 20 的阶乘.

  或者使用内置函数 factorial(20)

  如果使用 Factorial() 函数, 则会将 20! 进行因数分解.

  模运算使用 mod 或@ 运算符. 例如计算 (2^{2022}+10*9^2-365)\mod10007 , 输入

  使用 expmod() 函数可以快速执行模幂运算.

  例如计算 3^{123456789}\mod 10^{20} , 我们不能输入

  因为这里将先计算 3^{123456789} , 而这是一个非常大的数.

  得到结果

  主要的运算符有 +, -, *, /, %, ^, !, ==, ~. 其中 == 是比较运算符, 与之等价的是~.系统会自动替换为 ~.

  ~ 的优先级最低, 阶乘运算符 ! 的优先级最高. 但当碰到小括号(), 则小括号内的先算.

  ^ 的优先级次之, 即只比 ! 低. 例如 2^3! 将返回 64, 而不是 40320, 即 (2^3)!.

  *, /, % 分别是乘法、除法和整除运算符, 它们的优先级相同. a%b 所得是不完全商, 仅当 b|a 时才是完全商. 例如: 7%3 返回 2.

  +, - 的优先级仅比 ~ 高.

  输入的表达式中允许有空格, Calculator 在计算之前将这些空格自动去掉.

  这里看到数值计算的精度默认是八位, 最后一位四舍五入而得. 设置精度的函数是 setprecision().

  例如, 我们将精度设定为十位, 即小数点后面保留十位有效数字.

  Caculator 启动后默认的计算模式是数值计算模式, 使用 :mode 命令可以查看当前计算模式.

  最后的 >> 是控制台应用中的输入提示符. 在 GUI 版本中, 默认命令或表达式在 Command 窗口中输入, 因此可以忽略这个提示符.

  目前计算模式有数值计算模式、分数计算模式和多项式计算模式三种. 当输入 :mode=xxx (其实这里的xxx可以是任意字符, 比如输错了的情况)并回车, 系统会给出正确的提示.

  也就是, 命令 :mode=fraction 将切换到分数计算模式, 而 :mode=numerical 将切换到数值计算模式.

  要进行分数计算, 请先切换到分数计算模式.

  注: v0.544 版本更改了关于模式的内部逻辑, 不再将多项式计算模式与其他两种计算模式作排他性区别(原来对应到整数,,.), 因为多项式计算过程中, 系数的运算需要采用数值计算或分数计算模式. 因此, 将多项式计算模式对应到二进制的, 数值计算模式对应到二进制的, 分数计算模式对应到二进制的; 其中指或. 的语法也作了更新, 如下.

  常数 \pi 在计算中经常会碰到, 故 Calculator 内置了 \pi 的近似值, 精确到小数点后10000位.

  直接键入 pi() 将得到 3.14159265. 这是因为默认精度是 8 位. 使用 setprecision() 函数将精度设置为 10000位, 然后再键入 pi(), 就可以获得精确到小数点后10000位的 \pi 的近似值.

  常数 e 可以用函数 exp(1) 获得.

  e 的计算使用了公式

  e^x=1+\frac{1}{1!}x^1+\frac{1}{2!}x^2+\frac{1}{3!}x^3+\cdots+\frac{1}{n!}x^n+\cdots

  因此, 也可以使用 sum() 函数计算 e .

  如果需要将此和式进行展开, 则在 sum 函数中添加参数 expand, 如下.

  Calculator 内置了一些有用的函数. 使用 listfunctions() 或 listfunctions(1) 列出所有内置函数. 后者(提供参数1)将列出函数的具体签名. 可以使用 help(函数名) 列出此函数的具体用法.

  具体请下载 CalculatorApp.exe, 查看帮助文档.

  目前 Calculator 0.524 Pro 版本提供了 81 个函数.

  函数名功能qidBasic 版本CollatzCollatz 问题或 3x + 1 猜想.2624?EulerBrackets欧拉括号2965FactorialFactorial(n)计算n!, 并将其表为标准分解式.197?Factorise因子分解2672?Farey生成 Farey 序列.1160Fibonacci返回斐波那契数列中的第n项.2711?IndefiniteEquation求解不定方程 ax+by=12971Primes生成不超过N的素数列表.?any2decimal任意进制转十进制binary2decimal二进制转十进制?binary2graycode二进制数转格雷码?binom二项系数. binom(n,k) 返回 C_n^kcontinued_fraction连分数运算.2784cubicsum求解不定方程 x^3+y^3+z^3=ncubicsum2求解不定方程 x^3+y^3+z^3=ndecimal2any十进制转任意进制decimal2binary十进制转二进制?decimal2fraction十进制小数转为分数, 两种形式输出?decimal2hex十进制转十六进制?decimal2octal十进制转八进制?decimalToFraction小数转为分数, 与 decimal2fraction 的区别是这里只输出假分数的形式.?eq24算廿四2316exp指数函数 exp(x) 即 e^x?expmod快速模幂运算factorial计算一个数的阶乘. 这里仅输出 n! 的计算结果.?factorise因子分解farey同 Fareyfibonacci同 Fibonacci?firstfactor返回 N 的第一个因子.?fix_variables锁定已定义的变量?gcd求若干个数的最大公因子gcd2求若干个数的最大公因子getValueFromMemAddr根据变量地址返回变量的值.?getprecision获取当前计算精度.?goldbach将一个偶数表示为两个素数之和.2841?graycode2binary格雷码转成二进制?helphelp(fn) 显示函数 fn 的基本信息.?hex2decimal十六进制转十进制?index_of_prime给定素数 p, 返回它在素数列表中的序数.?iscomposite是否是合数.?isprime是否是素数.?ispseudoprime是否是伪素数.2296?lcm求若干个数的最小公倍数lenlen(string) 返回 string 的长度?list_pi_x打印 pi(x), A<=x<=Blistfunctions列出 Calculator 当前版本包含的函数.?listpseudoprimeslistpseudoprimes(N), 列出小于N的所有伪素数.2296?ln以 e 为底的对数函数, 即自然对数.?log同 ln?mobiusM?bius 函数2765?nextMRprimenextMRprime(n), 利用 Miller-Rabin 算法计算大于 n 的最小素数.?nextprimenextprime(n), 计算大于 n 的最小素数.?norm_pp-范数, norm_p(N,p) 计算数 N 的 p 进范数.octal2decimal八进制转十进制?ord_pp-阶, ord_p(N,p) 计算数 N 关于 p-进的阶.pp(m), 返回第 m 个素数.?pipi() 以当前精度(不超过10000位)返回圆周率π.pi(x) 将返回不超过 x 的素数个数.?prevMRprimeprevMRprime(n), 利用 Miller-Rabin 算法计算小于 n 的最大素数.?prevprimeprevprime(n), 计算小于 n 的最大素数.?print3x1Maps3x+1猜想, print3x1Maps(from,to) 将打印 Collatz(from) 到 Collatz(to) 的所有结果.printSeries打印数列的前N项. 语法类似于求和函数 sum.printSeries(general_term,x,minValue,maxValue,delimiter)最后一个参数是分隔符, 默认是逗号.q_DuanwuPlus端午节想到的一个问题, 加强版.?q_duanwu端午节想到的一个问题.?register?reversereverse(string), 将 string 逆序输出.reverse_plusreverse_plus(num1,num2), 将 num1, num2 先逆序然后相加.round四舍五入?setprecision设置计算精度.?solve解一般的整数方程, 语法为 solve(equation, x, minValue, maxValue), 其中 equation 是方程表达式, 等号用两个等号(==)表示.2306solve_n3plus_until_M3_eq_p3解整数方程 n^3+(n+1)^3+...+M^3=p^32976solve_x3plusy3_zn解整数方程 x^3+y^3=z^n, 其中 n>=3. 语法: solve_x3plusy3_zn(min,max)这里 min, max 是 x,y 的范围.2974sqrtsqrt(N), 求 N 的平方根.?sqrtnsqrt(N, m), 求 N 的 m 次方根.subsetsubset(N,m), 返回形如 {x_1, x_2, ..., x_m} 这样的向量或子集, 这里 x_i=0,1,2,...,N-1.sum求和函数, 计算级数的前N项和. 语法sum(general_term,x,minValue,maxValue)317symbolsymbol(x,val) 定义变量 x, 并将其赋值 val.trimzerostrimzeros(num), 将 num 首尾的0去掉.?xor异或运算.

  注: 表格中第三列 qid 指 http://atzjg.net/ 上问题的编号. 可在其首页的一个文本框中输入编号查看.

  欧拉函数

  欧拉函数(Euler's totient function) \varphi(m) 计算的是比 m 小且与 m 互素之正整数的个数. 也可以定义为与 m 互素的数就模 m 分成类的个数, 或者定义为模 m 的任一完全剩余组中与 m 互素的个数. (详见 A. K. 苏什凯维奇 著, 叶乃膺 译《数论初等教程》.)

  这里我们定义了函数 EulerVarphi(), 例如计算 \varphi(20221003) 只需键入 EulerVarphi(20221003).

  勒让德符号

  这里实现的函数 Legendre(a,p) 计算的是数论中的勒让德符号 \bigl(\frac{a}{p}\bigr) . 其具体定义可参见问题2855 . 这里 p 是奇素数, a 是不能被 p 整除的非零整数. 勒让德符号 \bigl(\frac{a}{p}\bigr) 的值要么是 1 要么是 -1 . 但函数 Legendre(a,p) 当检测到 ap 不满足定义要求时会返回 0. 当 p 是奇数但非素数时, 使用下面的雅可比符号计算, 即 Jacobi(a,p) .

  如果要显示计算的具体步骤, 可以加入第三个参数 .

  我们再看一个例子, 计算 \bigl(\frac{2023}{1231}\bigr) .

  注: 这两个例子参考自 A. K. 苏什凯维奇 著 叶乃膺 译 《数论初等教程》P.104--106.

  雅可比符号

  雅可比符号 \bigl(\frac{a}{p}\bigr) 是勒让德符号在保持勒让德符号的同余性质、Gauss互反律等性质下的推广. 这里不要求 p 必须是素数, p 是正的奇数, a 与其互素. 勒让德符号 \bigl(\frac{a}{p}\bigr) 在计算过程中必须将分子 a 进行因子分解, 在 a 非常大时会比较麻烦, 这也导致函数 Legendre(a,p) 的实现比较复杂. 而这里的 Jacobi(a,p) 函数的实现就比较直接, 每当分子是偶数, 需要将因子 2 都提取出来, 即 a=2^k b , 这里 b 是奇数. 从而再应用Gauss互反律、同余性质进行计算, 将分母不断变小.

  但某些情况下, 雅可比符号仍需要调用因子分解的程序. 例如当 a=2 时, 必须将 p 进行因子分解.

  例: 计算 \bigl(\frac{438}{593}\bigr)

  例: 计算 \bigl(\frac{853}{1409}\bigr)

  例: 计算 \bigl(\frac{2}{262992639}\bigr)

  双平方和问题的解数公式

  设 n 是正整数, 利用函数可以将 n 分解为

  n=2^\gamma\cdot p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_s^{\alpha_s}\cdot q_1^{\beta_1}q_2^{\beta_2}\cdots q_t^{\beta_t}

  的形式, 这里诸 p_iq_j 是互异的奇素数, 模 4 分别余 1 和 3, 即 p_i\equiv 1\pmod 4 , q_j\equiv 3\pmod 4 . i=1,2,\ldots,s; j=1,2,\ldots,t. \alpha_i\beta_j 以及 \gamma 都是非负整数.

  将计算一些特定的函数, 例如 \delta(n)\varepsilon(n)\xi(n) 等, 以后根据需求还会增加.

  由\delta(n)\varepsilon(n)\xi(n)这几个函数可得出双平方和问题的解数公式. 例如:

  定理 . 若用 r_2(n) 表示二次不定方程 x^2+y^2=n 整数解的数目, 则

  \begin{split} r_2(n)&=\mathrm{Card}\{(x,y)\in\mathbb{Z}^2\ :\ x^2+y^2=n\}\\ &=4\delta(n). \end{split}

  具体见 问题3106 .

  例:

  Calculator 提供了十进制与二进制、八进制、十六进制等之间的相互转换.

  功能: 将十进制数转成二进制形式.

  参数: 单参数, 接受十进制数.

  例

  binary2decimal()

  功能: 将二进制数转成十进制形式.

  参数: 单参数, 接受二进制数.

  例

  any2decimal( , )

  功能: 任意p进制数转成十进制形式.

  参数: 双参数. 第一个参数是p进制数的表达式, 第二个参数是 p.

  例

  decimal2any( , )

  功能: 十进制数转成任意p进制形式.

  参数: 双参数. 第一个参数是十进制数的表达式, 第二个参数是要转换的进制 p.

  例

  decimal2octal()

  功能: 十进制数转成八进制形式

  注意: 返回的八进制数以0开头.

  例

  octal2decimal()

  功能: 八进制数转成十进制形式

  注意: 输入的八进制数以0开头.

  例

  decimal2hex()

  功能: 十进制数转成十六进制形式

  注意: 返回的十六进制数以0x开头.

  例

  hex2decimal()

  功能: 十六进制数转成十进制形式

  注意: 输入的十六进制数以0x开头.

  例

  Calculator 提供了分数运算的功能. 在进行分数计算前, 请先设置计算模式为分数计算模式. 关于计算模式, 见“四则运算”一节.

  首先, 使用命令 :mode=fraction 将模式切换到分数计算模式

  这里给了一个例子, 输入 1/2+1/3 将返回 5/6. 如果在 numerical 模式下, 则返回 0.83333333.

  我们再试一下其他例子, 输入 1/2+1/3+1/4+1/5+1/6

  (这里使用 | 作为分数线的记号.)

  如果要计算 1+1/2+1/3+1/4+1/5+...+1/100, 那么最好使用求和函数 sum( , , , ). 这个函数需要输入四个参数, 输入 help(sum) 会提示用法如下:

  第一个参数指通项表达式, 第二个参数指自变量采用的符号, 第三和第四个参数指自变量的取值范围. 注意这里 x, minValue, maxValue 都是整数, 且 minValue<=x<=maxValue.

  因此, 要计算上面的求和, 我们只需输入

  如果在分数计算模式下, 则结果是

  这里提供了两个函数 decimal2fraction() 和 decimalToFraction(). 前者将输出整数部分与真分数部分相加的形式, 同时也输出假分数形式; 而后者只输出假分数的形式.

  例

  算廿四是一个扑克牌游戏, 其规则大家耳熟能详. 一副扑克牌, 去掉大小王, 将 A(即Ace)视为 1 或 11; 2,3,...,10 按牌面数字取值; J, Q, K 都算作 10. 随意抽取四张牌, 如果谁能用加减乘除先算得 24, 谁就胜.

  例如, 如果抽到 8, 3, 1, 9 四张牌, 那么我们可以这样算得 24.

  (9/3)*8*1

  现在使用内置的 eq24() 函数, 可以轻松得到所有可能的计算表达式.

  斐波那契数列

  在内置函数中, 或 函数用于计算第个斐波那契数 F_n . 其满足递推公式 F_n=F_{n-1}+F_{n-2} , 这里规定 F_0=0.

  函数可以加第二个参数 或 或 或 .

  例如 将列出前 n+1 个斐波那契数.

  例: 计算 F_{-5}

  打印数列

  用于打印数列 \{a_n\}_{n=1}^{m} . 语法是:

  指数列的通项 a_n , 第二个参数指其中的变元, 和是的变化范围, 最后一个参数是可选的, 默认是逗号.

  例, 打印数列 \Bigl\{\frac{(2*n-2)!}{(n-1)!}\Bigr\}_{n=1}^{\infty} 的前12项, 使用换行分隔符.

  打印由递推公式定义的数列

  例如, Hanoi 问题的递推关系为 a_n=2a_{n-1}+1 , n=2,3,\ldots . 初值 a_1=1 .

  首先将递推关系式改写为 a_{n+1}=2a_n+1 . 应用 函数就可以打印此数列 \{a_n\}_{n=1}^{N} .

  第一个参数是递推关系表达式, v0.537版本中的这个函数只能处理简单的递推关系式;第二个参数是变元, 这里是 a_n ;第三个参数是初值, 这里是指 a_1 的值 1;第四个参数是打印前多少项;第五个参数是分隔符, 可选参数, 默认是逗号. 可以是换行符 , 制表符 , 或者两个换行符 , 或其他任意字符串.对于递推关系 h_{n+1}=(4n-2)h_n , 初值 h_1=1 , 可以这样输入:

  函数也可以迭代打印一些字符串,

  现在需要打印十组和, 且使得和交替出现, 用默认的逗号作分隔符.

  打印在被替代后计算的结果, 打印5次. 若不需要计算, 则在第五个或第六个参数处使用选项. (注意, 和都是可选参数.)

  打印行星号, 第行的星号个数是.

  试一下下面的代码

  v0.541版本对作了改进, 可以处理形如 a_{2n+1}=\frac{a_n+n+1}{1+a_n*(n+1)} 的迭代式. 假设初始项是 a_3 , 其值为, 则如下输入:

  这里第一个参数仍是迭代式, 必须使用两个等号, 并且 a_{2n+1} 的下标应写成, 方便运算.第二个参数是初始项的赋值表达式, 这里是.第三个参数是打印的项数.第四个参数是分隔符, 跟之前一样, 可以使用 ,, 或其他字符.第五个参数可选, 若写或或, 则在每一项前打印行号. 如果要输出分数形式, 则先执行.

  例如: 求 I_n=\int_0^1\frac{x^n}{x+5}\mathrm{d}x , n=1,2,\ldots,100.

  易见 I_n 满足递推公式 I_n=\frac{1}{n}-5I_{n-1} .(参见问题3081.)先求初始值 I_0=\int_0^1\frac{1}{x+5}\mathrm{d}x=\ln(x+5)\Bigr . 值得注意的是, I_0 的精确性影响着序列 \{I_n\}_{n=0}^{+\infty} 的准确性.

  另外, Calculator 的计算精度也应和 I_0 的一致. 例如, 若取 I_1=1-5\ln 1.2\approx 0.0883922160302268689414 , 但在默认精度(小数点后8位)下, 计算到第13项便开始出现负值. 初始值的精度低会导致误差在递推公式计算过程中迅速积累, 以致于误差呈指数级增长.

  若要得到该序列前100项的相对精确值, 比如精度到小数点后100位, 那么先设置计算精度为100.

  计算 \ln1.2 , 此即 I_0 .

  将其赋给某个变量, 比如 a

  然后计算 I_1=\frac{1}{1}-5\cdot I_0=1-5a

  最后使用 函数计算 I_n .

  得到 I_{98}, I_{99}, I_{100} 的近似值如下.

  这里提供了 solve() 函数, 可以求解一般的整数方程. 语法为

  第一个参数 equation 是方程的表达式, 其中等号要用连续的两个'=' 表示; 第二个参数 x 是指方程表达式中未知量的名称; maxValue, minValue 指 x 的上下界( x\in[\mathrm{minValue}, \mathrm{maxValue}] ), 当然这里的 x, minValue, maxValue 都是整数.

  例, 求解方程 x^{340}\equiv 1\pmod{341} . 我们可以如下解决

  v0.550版本对函数进行了更新, 加入了求解一元一次方程、一元二次方程的功能. 例如, 求解方程 8x+9=0 , 则只需输入, 然后回车.

  如果切换至分数计算模式, 则会得到解 x=-\frac{9}{8} .

  对于一元二次方程 ax^2+bx+c=0, a\neq 0 我们知道它的两个解是 x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a} . 就是利用此求解公式计算两个解的, 当判别式 \Delta=b^2-4ac<0 时, 得到两个共轭复根.

  例: 求解方程 x^2+7x+8=0

  上面是在数值计算模式下进行的, 若在分数计算模式下, 我们会得到下面形式的解.

  例: 求解方程 x^2+x+1=0

  对于一元三次方程 x^3+ax^2+bx+c=0 , 作变换 y=x+\frac{a}{3} , 可变换为 y^3+py+q=0 的形式. 我们这里采用荷兰数学家许德(Johannes Hudde, 1628--1704)的方法求解.

  例 1. 求方程 x^3-x^2-x-2=0 的根.

  例 2. 求方程 x^3+1=0 的根.

  例 3. 求方程 x^3-6x+2=0 的根.

  利用可以数值求解五次方程的根.

  例. 求方程 x^5-4x^3-5=0 在附近的根.

  首先切换到多项式计算模式

  然后对f(x)=x^5-4x^3-5求导,

  计算 (x^5-4x^3-5)/(5x^4-12x^2) 的商和余式

  为提高计算的精度, 设定数值计算精度为100.

  然后使用printRecursiveSeries()函数计算迭代公式

  x_n-\dfrac{f(x_n)}{f'(x_n)}=x_n-(\dfrac{1}{5}x_n+\dfrac{-\frac{8}{5}x^3-5}{5x^4-12x^2})=\dfrac{4}{5}x_n+\dfrac{\frac{8}{5}x^3+5}{5x^4-12x^2}

  这里不妨迭代100次.

  最后检验一下是否满足原方程.

  精度很高.

  最简单的不定方程形如 ax+by=1 , 这可以使用函数 IndefiniteEquation(a,b) 求解.

  例, 求解不定方程 7x+9y=1 .

  若不定方程为 7x+9y=5 , 则键入 IndefiniteEquation(7,9;5) 注意最后一个参数 5 前面使用分号作为间隔符.

  中间输出的一些过程可以略过, 只需看最后的解. 事实上, ax+by=c 有解当且仅当 \gcd(a,b) . 在求解 7x+9y=5 前, 先判断 \gcd(7,9)=1 , 从而方程有解; 然后先计算相应的不定方程 7x+9y=1 , 得到解 x=4+9t , y=-3-7t . 最后只需将 4-3 分别乘以 5 即可.

  如果要求解 a_1 x_1+a_2 x_2+\cdots+a_n x_n=b 这样的不定方程, 则应输入

  注意 b 前面是分号.

  例1. 求解 25x-13y+7z=4

  例2. 求解 x+2y+3z=4

  例3. 求解 7x_1+4x_2-2x_3+3x_4=2

  定义方法很简单, 输入

  即定义了变量 a, 其值为 1. 可以键入 disp(a) 查看其值.

  命令 :list 则列出所有已定义的变量, 在 Result 窗口和 Variables 窗口都有显示.

  例如: Result 窗口列出已定义的变量 a 和 b, 并附带列出了它们在内存中的地址.

  而Variables窗口则以列表的形式列出这些变量.

  仿照简单变量的定义, 输入

  然后回车, 将得到一个2阶方阵. A 是矩阵的变量名. 如果仅输入

  则也会得到一个矩阵, 其具有内置变量名 __Matrix__ .

  上面也可以如下输入:

  或多行输入:

  在矩阵输入中, 空格和逗号都可以作为元素之间的分隔符, 分号是行结束符号. 矩阵元素的输入以左中括号[开始, 以右中括号]结束.

  逗号和空格可以同时作为分隔符; 多个连续的空格等同于单个空格; 相邻两个逗号中间有无空格都将自动插入0; 例如:

  得到矩阵 A=[1,0,3]

  //注意第二行分号前面没有空格.

  得到矩阵

  例

  将得到矩阵

  结果应该是

  det() 函数用于返回矩阵的行列式, 如果矩阵不是方阵, 则返回 NaN.

  矩阵的元素可以是分数, 在默认的计算模式(numerical)下, 只返回行列式的计算表达式. 若要计算其行列式, 则切换到分数模式(fraction)下计算.

  例

  回车后 Calculator 会显示下面的信息.

  上面顺带计算了矩阵 A 的行列式. 也可以输入 det(A) 获得.

  为使计算所得的值是分数, 将计算模式切换至 fraction.

  回车后, Calculator 显示

  Calculator 可以处理元素中有表达式的行列式, 例如输入如下矩阵

  如果在数值计算模式下, 则返回

  切换到分数计算模式

  然后重新输入上面的矩阵, 会得到行列式的精确值

  如果方阵中有一些符号, 也可以计算. 输入下面的矩阵

  在默认的数值计算模式下, 得到

  v0.544版本加入了inv(A)函数, 用于对矩阵 A求逆.

  若需要输出分数形式, 则先切换至模式.

  检验一下, 令 , 然后再输入 求 B^{-1} .

  在 v0.528 版本中, 我们加入了 polyn 模式, 即可以使用命令

  进入多项式计算模式. 这里只处理一元多项式, 且变元为 x . 以后根据需要进行改进, 以支持其他变元符号.

  此模式下输入多项式时, 系数和 x 之间不需要加 *.

  注意 !!! 在polyn模式下, 多项式参与加减乘除等运算必须使用圆括号括起来.

  如果将上面的多项式修改如下, 即在系数和之间插入乘号, 则得到结果可能不是我们想要的.

  这里 实际上是.

  同理返回 .

  Calculator 会在多项式进行四则运算后进行简化输出, 比如视为, 简写为 等等.

  但若将上面的和直接输入为并不会简化输出, 需要使用函数.

  或者将它们加上圆括号作加法

  求 x^3+x+1x+1 除所得的商和余式.

  例: 设 f(x)=x^4+3x^3-x^2-4x-3 , g(x)=3x^3+10x^2+2x-3 , 求 f(x) 除以 g(x) 的商式 q(x) 和余式 r(x) . [注: 此例子见 李炯生、查建国 编著 《线性代数》P.12]

  这个例子中, 系数之间的运算需要使用分数运算才能正确得到结果. 在 version=0.533 版本之后, Calculator 在多项式的运算中, 凡是系数之间的运算都使用分数运算.

  如果只想获得商, 则使用 运算符; 若只想获得余式, 则使用 运算符.

  从 v0.532 开始, 多项式模式下可以处理非整数的系数, 但是指数仍限定为整数(使用了 C++ 中的 long long 类型, 范围为-9223372036854775808~9223372036854775807, 即-2^63~2^63-1).

  可以尝试计算 (x+2)^{100} , 以及 (0.2x+1.3)^{10}

  需要注意的是, 当指数比较大时, 比如这里的 100 次方, 必须在 polyn 模式下计算. 否则在 numerical 模式下会非常慢.

  需要注意的是, 多项式要用圆括号括起来.

  在 v0.539 版本中, 我们扩充了 Calculator 的 solve() 函数的功能, 使之对多项式方程也能处理.

  例: 已知多项式 x^{13}+x+90 能被 x^2-x+a 整除, 其中 a 是整数, 求 a .

  根据题设, |a 一定是 90 的因子, 因此对于变量 a , 搜索的范围可以定为 [-90,90] .

  首先进入模式,

  然后, 使用函数. (solve 函数本质上是搜索.)

  假设 f(x)g(x) 是两个一元多项式, 使用辗转相除法可以得到它们的最大公因式 d(x) . 这里提供了函数 可以方便求出两个或多个一元多项式的公因式.

  例子:

  函数 将会详细给出计算最大公因式的具体步骤, 并且给出和, 使得

  d(x)=u(x)f(x)+v(x)g(x)

  例子:

  v.545 版本添加函数, 用于对一元多项式函数进行求导, 这里默认自变量为.

  注意这里也可以对 ax^{-n} 形式的项进行求导. 指数为负数时, 如不必加括号.

  设 f(x) 是一个多项式, 具有标准分解式

  f(x)=cp_1^{r_1}(x)p_2^{r_2}(x)\cdots p_s^{r_s}(x)

  f(x)f'(x) 的最大公因式必具有标准分解式

  p_1^{r_1-1}(x)p_2^{r_2-1}(x)\cdots p_s^{r_s-1}(x)

  于是

  \displaystyle\frac{f(x)}{(f(x),f'(x))}=cp_1(x)p_2(x)\cdots p_s(x)

  没有重因式.

  因此, 要判断 f(x) 是否含有重因式, 这是一个可以尝试的办法. 只要 f(x)f'(x) 不是互素的, 则上式也给出了对 f(x) 作因式分解的一个思路.

  例. 判别 f(x)=x^5-5x^4+7x^3-2x^2+4x-8 是否有重因式.

  先切换至多项式计算模式

  使用 diff() 先对 f(x) 求导

  然后再计算 f(x)f'(x) 的最大公因式,

  将其变为首一多项式,

  或者使用函数

  而, 这已经说明 f(x) 是有重因式的. 最后计算 \displaystyle\frac{f(x)}{(f(x),f'(x))} ,

  因此

  x^5-5x^4+7x^3-2x^2+4x-8=(x-2)^2\cdot(x^3-x^2-x-2)

  v0.553版本加入模式, 可以处理复数的加减乘除运算.

  需要注意的是, 复数要加括号. 中可以输入的形式, 但是和是作为复数与复数之间的运算符的. 因此暂时不能输入这种形式.

  上面的实际上是

  例: 计算

  从 v0.543 开始, 增加了从文件输入输出的功能. 如果要执行多条语句, 可以先将这些语句编辑到文本文件中. 例如 test.sy , 内容如下:

  然后在命令符终端执行命令 , 结果将输出到文件 .

  要注意的是, 模式下通常的计算会出错, 例如上面第五行去掉的话, 和的行列式输出为. 因此, 当不再使用模式时, 要及时切换回来.

  使用文本编辑器查看, 内容如下:

  使用下面的运行方式可以自己指定输入输出文件.

  这里指定输入文件, 指定输出文件. 输入输出文件都是文本文件, 后缀名无所谓. 这里输入文件的后缀名采用 是因为“数学”在吴语中的发音是 .

  例. 计算 (\arctan x)^2 的展开式.

  根据问题2877的解答, (\arctan x)^2 可表示为

  a_1 x^2-a_2 x^4+a_3 x^6-a_4 x^8+\cdots

  其中 a_m=\sum_{n=1}^{m}\frac{1}{(2n-1)(2m-(2n-1))} . 于是编写文件 arctan2.sy, 内容如下:

  然后在命令提示符窗口运行下面的命令

  从中得到

  (\arctan x)^2=x^2-\frac{2}{3}x^4+\frac{23}{45}x^6-\frac{44}{105}x^8+\frac{563}{1575}x^{10}-\frac{3254}{10395}x^{12}+\frac{88069}{315315}x^{14}+\cdots

  借助 clox (Robert Nystrom 用C语言写的一个解释器) , Sowya 现在可以进行简单地编程. (目前正设法将clox与Sowya进行交互, 并对clox添加一些功能.)

  使用命令进入编程模式, 此时会出现的提示符: . 键入并回车即退出编程模式, 回到环境.

  中可以直接执行一些语句, 这些语句被称为. 中的一些命令等亦可以认为是.

  例如, 最简单的打印. 我们可以使用指令或者指令, 两者的功能基本相同, 会在最后打印换行符.

  每条语句最后要加作为结束. 字符串一般用双引号括起来. 但为了与更好对接, 在中直接输入的数(即不适用双引号界定的数)也被认为是字符串.

  和可以一次打印多项, 例如:

  但是这样挨在一起会导致分不清结果, 改进如下:

  这里和分别是制表符和换行符.

  使用关键字可以声明一个或多个变量.

  可以一次声明多个变量, 中间用逗号隔开

  这里声明了变量 , 并分别赋值和. 声明为, 值为. 变量并未赋值, 从而定义失败. 我们用检验一下.

  是中预定义的值, 等同于C语言中的.

  中的函数分为内置函数(Native function)和自定义函数.

  可以在编译前添加内置函数(Native function) , 这里我们加入了内置函数, 它可以接受有限多个参数.

  例. 计算12,3,4,5,98这五个数的平均值.

  当加载与其同名的自定义函数后, 内置函数就不起作用了.

  例. 使用内置函数打印字符串的第个字符.

  例. 打印 9\times10^{17}9\times10^{17}+9 的平方.

  首先进入编程模式,

  的提示符是单个大于号. 然后定义函数, 不妨命名为, 函数以关键字开头, 后接函数名, 然后是一对圆括号, 其中是参数列表, 参数与参数之间使用逗号分隔. 最后是以界定的函数体. 如果函数不复杂, 可以将函数的代码写在一行上.

  输入 执行该函数.

  在写程序时, 经常需要多行输入, 则第一个字符以开始, 即可进入多行输入, 最后只要以结尾即可.

  例 2. 打印 2^n , n=9,10,11,\ldots,19.

  这和 的结果是一致的.

  例. 编程打印斐波那契数列. 将下列内容编辑到文件 , 这里是文件夹的名称.

  注意到这里数字后面加了字母, 表示采用双精度表示(即类型). 然后, 进入后运行

  我们也可以将函数改写如下, 没有.

  备注:

  使用类型的数进行计算要比内置的大数计算要快. 尽可能不使用递归求解, 因为递归会消耗很多内存, 效率比较低. 例如这里求解斐波那契数列, 不如内置的函数来得快. 在中, 增加了内置函数, 用于返回字符串的长度. 不过这里的字符串必须要用双引号括起来.

  例. 对于 m=2^n , n=1,2,\ldots,99. 计算.

  在中加入了内置函数, 它将返回字符串的第个字符, 这里从开始.

  例. 将下面的代码编辑至文件, 然后运行

  运行结果是

  v0.558 版本增加了导入外部文件的功能, 比如写一个最简单的函数, 用于求两个数的均值. 将下面的代码编辑至中.

  进入编程模式, 并使用加载含有上面函数的文件.

  然后执行, 该函数也可以接受变量.

  这里的练习对应于 https://www.runoob.com/ 上关于 C 语言的练习.

  练习1. C 练习实例1 | 菜鸟教程 (runoob.com)

  题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

  解答: 将下面的内容编辑到文件 exer1.sy, 在 clox 模式下, 使用 load() 加载此文件即可.

  将上述代码保存到文件中, 使用加载, 然后运行.

  详见 atzjg.net 上的问题3164.

  练习2. C 练习实例2 | 菜鸟教程 (runoob.com)

  见 atzjg.net 问题3166.

  v0.542 是第一阶段的最后一个版本.

  从 v0.543 开始, Calculator 支持最简单的批处理任务. 即读取文件, 执行其中的每一行语句, 并输出.

  从 v0.550 开始, 将 Calculator 更名为 Sowya.

  从 v0.555 开始, Sowya 引入 clox (Crafting Interpreters) , 可以进行简单的编程.