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. 计算 和 .
例2. 计算 和
对于 , 计算结果暂时未进行化简.
手动化简
因此, 结果是 . 在后面讲计算模式时, 我们会提到分数计算模式. 若要切换到分数计算模式, 则使用命令.
这里表示 . 即 , .
例, 计算 20 的阶乘.
或者使用内置函数 factorial(20)
如果使用 Factorial() 函数, 则会将 20! 进行因数分解.
模运算使用 mod 或@ 运算符. 例如计算 , 输入
使用 expmod() 函数可以快速执行模幂运算.
例如计算 , 我们不能输入
因为这里将先计算 , 而这是一个非常大的数.
得到结果
主要的运算符有 +, -, *, /, %, ^, !, ==, ~. 其中 == 是比较运算符, 与之等价的是~.系统会自动替换为 ~.
~ 的优先级最低, 阶乘运算符 ! 的优先级最高. 但当碰到小括号(), 则小括号内的先算.
^ 的优先级次之, 即只比 ! 低. 例如 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 版本更改了关于模式的内部逻辑, 不再将多项式计算模式与其他两种计算模式作排他性区别(原来对应到整数,,.), 因为多项式计算过程中, 系数的运算需要采用数值计算或分数计算模式. 因此, 将多项式计算模式对应到二进制的, 数值计算模式对应到二进制的, 分数计算模式对应到二进制的; 其中指或. 的语法也作了更新, 如下.
常数 在计算中经常会碰到, 故 Calculator 内置了 的近似值, 精确到小数点后10000位.
直接键入 pi() 将得到 3.14159265. 这是因为默认精度是 8 位. 使用 setprecision() 函数将精度设置为 10000位, 然后再键入 pi(), 就可以获得精确到小数点后10000位的 的近似值.
常数 可以用函数 exp(1) 获得.
的计算使用了公式
因此, 也可以使用 sum() 函数计算 .
如果需要将此和式进行展开, 则在 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) 计算的是比 小且与 互素之正整数的个数. 也可以定义为与 互素的数就模 分成类的个数, 或者定义为模 的任一完全剩余组中与 互素的个数. (详见 A. K. 苏什凯维奇 著, 叶乃膺 译《数论初等教程》.)
这里我们定义了函数 EulerVarphi(), 例如计算 只需键入 EulerVarphi(20221003).
勒让德符号
这里实现的函数 Legendre(a,p) 计算的是数论中的勒让德符号 . 其具体定义可参见问题2855 . 这里 是奇素数, 是不能被 整除的非零整数. 勒让德符号 的值要么是 要么是 . 但函数 Legendre(a,p) 当检测到 或 不满足定义要求时会返回 0. 当 是奇数但非素数时, 使用下面的雅可比符号计算, 即 Jacobi(a,p) .
如果要显示计算的具体步骤, 可以加入第三个参数 .
我们再看一个例子, 计算 .
注: 这两个例子参考自 A. K. 苏什凯维奇 著 叶乃膺 译 《数论初等教程》P.104--106.
雅可比符号
雅可比符号 是勒让德符号在保持勒让德符号的同余性质、Gauss互反律等性质下的推广. 这里不要求 必须是素数, 是正的奇数, 与其互素. 勒让德符号 在计算过程中必须将分子 进行因子分解, 在 非常大时会比较麻烦, 这也导致函数 Legendre(a,p) 的实现比较复杂. 而这里的 Jacobi(a,p) 函数的实现就比较直接, 每当分子是偶数, 需要将因子 2 都提取出来, 即 , 这里 是奇数. 从而再应用Gauss互反律、同余性质进行计算, 将分母不断变小.
但某些情况下, 雅可比符号仍需要调用因子分解的程序. 例如当 时, 必须将 进行因子分解.
例: 计算
例: 计算
例: 计算
双平方和问题的解数公式
设 是正整数, 利用函数可以将 分解为
的形式, 这里诸 和 是互异的奇素数, 模 4 分别余 1 和 3, 即 , . 和 以及 都是非负整数.
将计算一些特定的函数, 例如 、 、 等, 以后根据需求还会增加.
由 、 、 这几个函数可得出双平方和问题的解数公式. 例如:
定理 . 若用 表示二次不定方程 整数解的数目, 则
具体见 问题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() 函数, 可以轻松得到所有可能的计算表达式.
斐波那契数列
在内置函数中, 或 函数用于计算第个斐波那契数 . 其满足递推公式 , 这里规定 .
函数可以加第二个参数 或 或 或 .
例如 将列出前 n+1 个斐波那契数.
例: 计算
打印数列
用于打印数列 . 语法是:
指数列的通项 , 第二个参数指其中的变元, 和是的变化范围, 最后一个参数是可选的, 默认是逗号.
例, 打印数列 的前12项, 使用换行分隔符.
打印由递推公式定义的数列
例如, Hanoi 问题的递推关系为 , . 初值 .
首先将递推关系式改写为 . 应用 函数就可以打印此数列 .
第一个参数是递推关系表达式, v0.537版本中的这个函数只能处理简单的递推关系式;第二个参数是变元, 这里是 ;第三个参数是初值, 这里是指 的值 1;第四个参数是打印前多少项;第五个参数是分隔符, 可选参数, 默认是逗号. 可以是换行符 , 制表符 , 或者两个换行符 , 或其他任意字符串.对于递推关系 , 初值 , 可以这样输入:
函数也可以迭代打印一些字符串,
现在需要打印十组和, 且使得和交替出现, 用默认的逗号作分隔符.
打印在被替代后计算的结果, 打印5次. 若不需要计算, 则在第五个或第六个参数处使用选项. (注意, 和都是可选参数.)
打印行星号, 第行的星号个数是.
试一下下面的代码
v0.541版本对作了改进, 可以处理形如 的迭代式. 假设初始项是 , 其值为, 则如下输入:
这里第一个参数仍是迭代式, 必须使用两个等号, 并且 的下标应写成, 方便运算.第二个参数是初始项的赋值表达式, 这里是.第三个参数是打印的项数.第四个参数是分隔符, 跟之前一样, 可以使用 ,, 或其他字符.第五个参数可选, 若写或或, 则在每一项前打印行号. 如果要输出分数形式, 则先执行.
例如: 求 ,
易见 满足递推公式 .(参见问题3081.)先求初始值 . 值得注意的是, 的精确性影响着序列 的准确性.
另外, Calculator 的计算精度也应和 的一致. 例如, 若取 , 但在默认精度(小数点后8位)下, 计算到第13项便开始出现负值. 初始值的精度低会导致误差在递推公式计算过程中迅速积累, 以致于误差呈指数级增长.
若要得到该序列前100项的相对精确值, 比如精度到小数点后100位, 那么先设置计算精度为100.
计算 , 此即 .
将其赋给某个变量, 比如 a
然后计算
最后使用 函数计算 .
得到 的近似值如下.
这里提供了 solve() 函数, 可以求解一般的整数方程. 语法为
第一个参数 equation 是方程的表达式, 其中等号要用连续的两个'=' 表示; 第二个参数 x 是指方程表达式中未知量的名称; maxValue, minValue 指 x 的上下界( ), 当然这里的 x, minValue, maxValue 都是整数.
例, 求解方程 . 我们可以如下解决
v0.550版本对函数进行了更新, 加入了求解一元一次方程、一元二次方程的功能. 例如, 求解方程 , 则只需输入, 然后回车.
如果切换至分数计算模式, 则会得到解 .
对于一元二次方程 , 我们知道它的两个解是 . 就是利用此求解公式计算两个解的, 当判别式 时, 得到两个共轭复根.
例: 求解方程
上面是在数值计算模式下进行的, 若在分数计算模式下, 我们会得到下面形式的解.
例: 求解方程
对于一元三次方程 , 作变换 , 可变换为 的形式. 我们这里采用荷兰数学家许德(Johannes Hudde, 1628--1704)的方法求解.
例 1. 求方程 的根.
例 2. 求方程 的根.
例 3. 求方程 的根.
利用可以数值求解五次方程的根.
例. 求方程 在附近的根.
首先切换到多项式计算模式
然后对f(x)=x^5-4x^3-5求导,
计算 (x^5-4x^3-5)/(5x^4-12x^2) 的商和余式
为提高计算的精度, 设定数值计算精度为100.
然后使用printRecursiveSeries()函数计算迭代公式
这里不妨迭代100次.
最后检验一下是否满足原方程.
精度很高.
最简单的不定方程形如 , 这可以使用函数 IndefiniteEquation(a,b) 求解.
例, 求解不定方程 .
若不定方程为 , 则键入 IndefiniteEquation(7,9;5) 注意最后一个参数 5 前面使用分号作为间隔符.
中间输出的一些过程可以略过, 只需看最后的解. 事实上, 有解当且仅当 . 在求解 前, 先判断 , 从而方程有解; 然后先计算相应的不定方程 , 得到解 , . 最后只需将 和 分别乘以 即可.
如果要求解 这样的不定方程, 则应输入
注意 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求逆.
若需要输出分数形式, 则先切换至模式.
检验一下, 令 , 然后再输入 求 .
在 v0.528 版本中, 我们加入了 polyn 模式, 即可以使用命令
进入多项式计算模式. 这里只处理一元多项式, 且变元为 . 以后根据需要进行改进, 以支持其他变元符号.
此模式下输入多项式时, 系数和 x 之间不需要加 *.
注意 !!! 在polyn模式下, 多项式参与加减乘除等运算必须使用圆括号括起来.
如果将上面的多项式修改如下, 即在系数和之间插入乘号, 则得到结果可能不是我们想要的.
这里 实际上是.
同理返回 .
Calculator 会在多项式进行四则运算后进行简化输出, 比如视为, 简写为 等等.
但若将上面的和直接输入为并不会简化输出, 需要使用函数.
或者将它们加上圆括号作加法
求 被 除所得的商和余式.
例: 设 , , 求 除以 的商式 和余式 . [注: 此例子见 李炯生、查建国 编著 《线性代数》P.12]
这个例子中, 系数之间的运算需要使用分数运算才能正确得到结果. 在 version=0.533 版本之后, Calculator 在多项式的运算中, 凡是系数之间的运算都使用分数运算.
如果只想获得商, 则使用 运算符; 若只想获得余式, 则使用 运算符.
从 v0.532 开始, 多项式模式下可以处理非整数的系数, 但是指数仍限定为整数(使用了 C++ 中的 long long 类型, 范围为-9223372036854775808~9223372036854775807, 即-2^63~2^63-1).
可以尝试计算 , 以及
需要注意的是, 当指数比较大时, 比如这里的 100 次方, 必须在 polyn 模式下计算. 否则在 numerical 模式下会非常慢.
需要注意的是, 多项式要用圆括号括起来.
在 v0.539 版本中, 我们扩充了 Calculator 的 solve() 函数的功能, 使之对多项式方程也能处理.
例: 已知多项式 能被 整除, 其中 是整数, 求 .
根据题设, 一定是 的因子, 因此对于变量 , 搜索的范围可以定为 .
首先进入模式,
然后, 使用函数. (solve 函数本质上是搜索.)
假设 和 是两个一元多项式, 使用辗转相除法可以得到它们的最大公因式 . 这里提供了函数 可以方便求出两个或多个一元多项式的公因式.
例子:
函数 将会详细给出计算最大公因式的具体步骤, 并且给出和, 使得
例子:
v.545 版本添加函数, 用于对一元多项式函数进行求导, 这里默认自变量为.
注意这里也可以对 形式的项进行求导. 指数为负数时, 如不必加括号.
设 是一个多项式, 具有标准分解式
和 的最大公因式必具有标准分解式
于是
没有重因式.
因此, 要判断 是否含有重因式, 这是一个可以尝试的办法. 只要 和 不是互素的, 则上式也给出了对 作因式分解的一个思路.
例. 判别 是否有重因式.
先切换至多项式计算模式
使用 diff() 先对 求导
然后再计算 和 的最大公因式,
将其变为首一多项式,
或者使用函数
而, 这已经说明 是有重因式的. 最后计算 ,
因此
v0.553版本加入模式, 可以处理复数的加减乘除运算.
需要注意的是, 复数要加括号. 中可以输入的形式, 但是和是作为复数与复数之间的运算符的. 因此暂时不能输入这种形式.
上面的实际上是
例: 计算
从 v0.543 开始, 增加了从文件输入输出的功能. 如果要执行多条语句, 可以先将这些语句编辑到文本文件中. 例如 test.sy , 内容如下:
然后在命令符终端执行命令 , 结果将输出到文件 .
要注意的是, 模式下通常的计算会出错, 例如上面第五行去掉的话, 和的行列式输出为. 因此, 当不再使用模式时, 要及时切换回来.
使用文本编辑器查看, 内容如下:
使用下面的运行方式可以自己指定输入输出文件.
这里指定输入文件, 指定输出文件. 输入输出文件都是文本文件, 后缀名无所谓. 这里输入文件的后缀名采用 是因为“数学”在吴语中的发音是 .
例. 计算 的展开式.
根据问题2877的解答, 可表示为
其中 . 于是编写文件 arctan2.sy, 内容如下:
然后在命令提示符窗口运行下面的命令
从中得到
借助 clox (Robert Nystrom 用C语言写的一个解释器) , Sowya 现在可以进行简单地编程. (目前正设法将clox与Sowya进行交互, 并对clox添加一些功能.)
使用命令进入编程模式, 此时会出现的提示符: . 键入并回车即退出编程模式, 回到环境.
中可以直接执行一些语句, 这些语句被称为. 中的一些命令等亦可以认为是.
例如, 最简单的打印. 我们可以使用指令或者指令, 两者的功能基本相同, 会在最后打印换行符.
每条语句最后要加作为结束. 字符串一般用双引号括起来. 但为了与更好对接, 在中直接输入的数(即不适用双引号界定的数)也被认为是字符串.
和可以一次打印多项, 例如:
但是这样挨在一起会导致分不清结果, 改进如下:
这里和分别是制表符和换行符.
使用关键字可以声明一个或多个变量.
可以一次声明多个变量, 中间用逗号隔开
这里声明了变量 , 并分别赋值和. 声明为, 值为. 变量并未赋值, 从而定义失败. 我们用检验一下.
是中预定义的值, 等同于C语言中的.
中的函数分为内置函数(Native function)和自定义函数.
可以在编译前添加内置函数(Native function) , 这里我们加入了内置函数, 它可以接受有限多个参数.
例. 计算12,3,4,5,98这五个数的平均值.
当加载与其同名的自定义函数后, 内置函数就不起作用了.
例. 使用内置函数打印字符串的第个字符.
例. 打印 到 的平方.
首先进入编程模式,
的提示符是单个大于号. 然后定义函数, 不妨命名为, 函数以关键字开头, 后接函数名, 然后是一对圆括号, 其中是参数列表, 参数与参数之间使用逗号分隔. 最后是以界定的函数体. 如果函数不复杂, 可以将函数的代码写在一行上.
输入 执行该函数.
在写程序时, 经常需要多行输入, 则第一个字符以开始, 即可进入多行输入, 最后只要以结尾即可.
例 2. 打印 ,
这和 的结果是一致的.
例. 编程打印斐波那契数列. 将下列内容编辑到文件 , 这里是文件夹的名称.
注意到这里数字后面加了字母, 表示采用双精度表示(即类型). 然后, 进入后运行
我们也可以将函数改写如下, 没有.
备注:
使用类型的数进行计算要比内置的大数计算要快. 尽可能不使用递归求解, 因为递归会消耗很多内存, 效率比较低. 例如这里求解斐波那契数列, 不如内置的函数来得快. 在中, 增加了内置函数, 用于返回字符串的长度. 不过这里的字符串必须要用双引号括起来.
例. 对于 , 计算.
在中加入了内置函数, 它将返回字符串的第个字符, 这里从开始.
例. 将下面的代码编辑至文件, 然后运行
运行结果是
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) , 可以进行简单的编程.
上一篇:楹联本该姓“楹”
下一篇:大连大学排名一览表(大连大学排名一览表及分数线是多少)
最近更新教育管理
- 德州市社保中心组织开展12333社保咨询日及服务体验活动
- 郁亮关于房地产的最新判断
- 新sat写作多长时间
- 中超最新积分榜:山东泰山稳居第2,距离榜首只差5分!三镇升6
- 拒绝教师“躺平”,湖北一地出招
- 九江市人社局精准服务推动高校毕业生高质量就业
- 逢八秩晋五·续摇篮华章 ——西安市第一保育院学术讨论暨摇篮课程成果分享活动
- 奇安信集团总裁吴云坤赴南京信息工程大学交流座谈
- “重礼兴乐”涵育师生家国情怀
- 上汽大众途观L(Tiguan L)和探岳怎么选?看完这篇就有答案
- 我省严禁艺考考点院校参与应试培训活动
- 深度介入基础设施建设,推动人才培养与人文交流 十年大手笔!江苏高校同绘丝路画卷
- 行而不缀,未来可期
- 大量编内!福建多家好单位招人!
- 首届川渝“巴蜀杯”中学生排球联赛开赛
- 平安产险重庆分公司开展2023年金融消费者权益保护教育宣传月“五进入”活动
- 湖南娄底:全面优化项目建设环境
- 辽宁科技大学材料与冶金学院开展新生入学教育系列活动
- 明年起,江苏开设6类艺术类省统考
- 我真的很棒——合肥市荣幼教育集团开展幼小衔接活动
- 快看:首列车亮相,郑州这两条地铁新进展来了!
- 推动农业绿色发展 淄博打开农民增收“新密码”
- sat阅读填空题的答题方法
- 主题教育|枣庄市司法局采取有力措施 确保主题教育高质高效推进
- 昆明市工会驿站普惠日活动启动