Questions in category: 开发计划 (DevPlan)
软件 >> Calculator >> 开发计划
<[1] [2] [3] >

11. [DevPlan] 关于 Calculator 与 CalculatorApp 的编译

Posted by haifeng on 2023-03-15 12:38:45 last update 2023-03-15 12:38:45 | Answers (0) | 收藏


Calculator 工程中的文件均使用 ANSI 编码, 而 CalculatorApp 工程是在 Upp 下组织的, 故均使用 utf-8 BOM 编码.

当 Calculator 工程中某文件使用了 UTF8编码, 在编译时很可能出现很多奇怪的错误. 比如:

C3927 “->“: 非函数声明符后不允许尾随返回类型等错误

 

而 CalculatorApp 工程中某文件即使使用了 UTF8编码, 也可能导致很多奇怪的错误.

12. [DevPlan] Calculator 中对执行语句的解析

Posted by haifeng on 2023-03-15 08:45:14 last update 2023-03-15 08:45:14 | Answers (0) | 收藏


目前每次只是执行一条语句, 即对于单语句进行解析.

紧接着目标是从文件读取, 依次执行.

最后是解析文件.

13. [DevPlan] 动态调用函数.

Posted by haifeng on 2023-03-01 12:27:25 last update 2023-03-01 12:27:25 | Answers (0) | 收藏


我们已经有了 getValueFromMemAddr() 函数, 设想定义一个结构, 然后返回这个结构的地址.

如果 a 是一个结构, 用点操作符调用 a 中的变量或函数成员. 实现动态调用函数.

 

14. [DevPlan] 增强 solve() 函数的功能, 使其可以处理等式中的函数.

Posted by haifeng on 2023-02-16 14:19:11 last update 2023-02-16 14:19:11 | Answers (0) | 收藏


>> Primes(100)
in> Primes(100)
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

Time used:     000
out> 25

------------------------

>> solve(p(n)==41,n,1,25)
in> solve(p(n)~41,n,1,25)

------------------------

15. [DevPlan] 将十进制小数转为二进制

Posted by haifeng on 2023-02-12 20:16:07 last update 2023-02-12 20:36:55 | Answers (1) | 收藏


现在考虑 $(0,1)$ 之间的有限小数.

对于形如 $\frac{1}{2^k}$ 的小数, 例如

\[0.5=\frac{1}{2},\quad 0.25=\frac{1}{2^2},\quad 0.125=\frac{1}{2^3},\quad 0.0625=\frac{1}{2^4},\quad\]

它们的二进制形式很简单, 分别为

\[0.5=(0.1)_2,\quad 0.25=(0.01)_2,\quad 0.125=(0.001)_2,\quad 0.0625=(0.0001)_2\]


这里打印 $\frac{1}{2^1}, \frac{1}{2^2}, \frac{1}{2^3}, \cdots, \frac{1}{2^{100}}$ 的小数形式.  

可以看到 $\frac{1}{2^n}$ 的小数形式在小数点之后有 $n$ 位数字.  $n$ 从 3 开始, 尾部以 125, 625 交替出现: 奇数为 125, 偶数为 625.

in> printSeries(1/2^n,n,1,100,\n)
0.5
0.25
0.125
0.0625
0.03125
0.015625
0.0078125
0.00390625
0.001953125
0.0009765625
0.00048828125
0.000244140625
0.0001220703125
0.00006103515625
0.000030517578125
0.0000152587890625
0.00000762939453125
0.000003814697265625
0.0000019073486328125
0.00000095367431640625
0.000000476837158203125
0.0000002384185791015625
0.00000011920928955078125
0.000000059604644775390625
0.0000000298023223876953125
0.00000001490116119384765625
0.000000007450580596923828125
0.0000000037252902984619140625
0.00000000186264514923095703125
0.000000000931322574615478515625
0.0000000004656612873077392578125
0.00000000023283064365386962890625
0.000000000116415321826934814453125
0.0000000000582076609134674072265625
0.00000000002910383045673370361328125
0.000000000014551915228366851806640625
0.0000000000072759576141834259033203125
0.00000000000363797880709171295166015625
0.000000000001818989403545856475830078125
0.0000000000009094947017729282379150390625
0.00000000000045474735088646411895751953125
0.000000000000227373675443232059478759765625
0.0000000000001136868377216160297393798828125
0.00000000000005684341886080801486968994140625
0.000000000000028421709430404007434844970703125
0.0000000000000142108547152020037174224853515625
0.00000000000000710542735760100185871124267578125
0.000000000000003552713678800500929355621337890625
0.0000000000000017763568394002504646778106689453125
0.00000000000000088817841970012523233890533447265625
0.000000000000000444089209850062616169452667236328125
0.0000000000000002220446049250313080847263336181640625
0.00000000000000011102230246251565404236316680908203125
0.000000000000000055511151231257827021181583404541015625
0.0000000000000000277555756156289135105907917022705078125
0.00000000000000001387778780781445675529539585113525390625
0.000000000000000006938893903907228377647697925567626953125
0.0000000000000000034694469519536141888238489627838134765625
0.00000000000000000173472347597680709441192448139190673828125
0.000000000000000000867361737988403547205962240695953369140625
0.0000000000000000004336808689942017736029811203479766845703125
0.00000000000000000021684043449710088680149056017398834228515625
0.000000000000000000108420217248550443400745280086994171142578125
0.0000000000000000000542101086242752217003726400434970855712890625
0.00000000000000000002710505431213761085018632002174854278564453125
0.000000000000000000013552527156068805425093160010874271392822265625
0.0000000000000000000067762635780344027125465800054371356964111328125
0.00000000000000000000338813178901720135627329000271856784820556640625
0.000000000000000000001694065894508600678136645001359283924102783203125
0.0000000000000000000008470329472543003390683225006796419620513916015625
0.00000000000000000000042351647362715016953416125033982098102569580078125
0.000000000000000000000211758236813575084767080625169910490512847900390625
0.0000000000000000000001058791184067875423835403125849552452564239501953125
0.00000000000000000000005293955920339377119177015629247762262821197509765625
0.000000000000000000000026469779601696885595885078146238811314105987548828125
0.0000000000000000000000132348898008484427979425390731194056570529937744140625
0.00000000000000000000000661744490042422139897126953655970282852649688720703125
0.000000000000000000000003308722450212110699485634768279851414263248443603515625
0.0000000000000000000000016543612251060553497428173841399257071316242218017578125
0.00000000000000000000000082718061255302767487140869206996285356581211090087890625
0.000000000000000000000000413590306276513837435704346034981426782906055450439453125
0.0000000000000000000000002067951531382569187178521730174907133914530277252197265625
0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125
0.000000000000000000000000051698788284564229679463043254372678347863256931304931640625
0.0000000000000000000000000258493941422821148397315216271863391739316284656524658203125
0.00000000000000000000000001292469707114105741986576081359316958696581423282623291015625
0.000000000000000000000000006462348535570528709932880406796584793482907116413116455078125
0.0000000000000000000000000032311742677852643549664402033982923967414535582065582275390625
0.00000000000000000000000000161558713389263217748322010169914619837072677910327911376953125
0.000000000000000000000000000807793566946316088741610050849573099185363389551639556884765625
0.0000000000000000000000000004038967834731580443708050254247865495926816947758197784423828125
0.00000000000000000000000000020194839173657902218540251271239327479634084738790988922119140625
0.000000000000000000000000000100974195868289511092701256356196637398170423693954944610595703125
0.0000000000000000000000000000504870979341447555463506281780983186990852118469774723052978515625
0.00000000000000000000000000002524354896707237777317531408904915934954260592348873615264892578125
0.000000000000000000000000000012621774483536188886587657044524579674771302961744368076324462890625
0.0000000000000000000000000000063108872417680944432938285222622898373856514808721840381622314453125
0.00000000000000000000000000000315544362088404722164691426113114491869282574043609201908111572265625
0.000000000000000000000000000001577721810442023610823457130565572459346412870218046009540557861328125
0.0000000000000000000000000000007888609052210118054117285652827862296732064351090230047702789306640625


------------------------

 

16. [DevPlan] 改进计算 $e$ 的算法

Posted by haifeng on 2023-02-11 22:53:50 last update 2023-02-11 22:54:05 | Answers (0) | 收藏


当然, 我们可以用下面的公式进行计算. Calculator 最初就是使用这个公式进行计算. 但缺点很明显, 随着 $n$ 的增大, 计算会变得很慢.

\[
e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\cdots+\frac{1}{n!}+\cdots
\]

还有更好的办法, 见

The constant $e$ and its computation (free.fr)

计算$e$和$π$ (infinityfreeapp.com)

 

17. [DevPlan] 多项式乘法的改进

Posted by haifeng on 2023-02-11 14:47:26 last update 2023-02-11 14:47:26 | Answers (0) | 收藏


>> :mode
Calculating mode: polyn

>> (3x-x^6)2x
in> (3x-x^6)2x

out>

------------------------


>> (3x-x^6)*2x
in> (3x-x^6)*2x

out> -2x^7+6x^2

------------------------


>> 2x(3x-x^6)
in> 2x(3x-x^6)

out> -2x^7+6x^2

------------------------


>> (3x-x^6)(2x)
in> (3x-x^6)*(2x)

out> -2x^7+6x^2

------------------------


>> (3x-x^6)(2)x
in> (3x-x^6)*(2)x

out> 2x^1

------------------------


>> (3x-x^6)(2)
in> (3x-x^6)*(2)

out> -2x^6+6x^1

------------------------


>> (3x-x^6)(2)(x)
in> (3x-x^6)*(2)*(x)

out> -2x^7+6x^2

------------------------

 

18. [DevPlan] 给定数列的递推公式, 打印数列的前若干项.

Posted by haifeng on 2023-02-04 10:15:46 last update 2023-02-05 20:57:46 | Answers (0) | 收藏


设 $a_{n+1}=\dfrac{a_n^2+2}{a_n+4}$, $a_1=2$, 求出数列 $\{a_n\}$ 的前若干项.

 

注: 此题来源 https://bbs.emath.ac.cn/thread-18747-1-1.html


目前可以这样做, 令 $y=\dfrac{x^2+2}{x+4}$, 初始值 $x=2$. 求出 $y$ 后替代 $x$, 然后再计算 $y$.

 

>> x=2
--------------------
>> y=(x^2+2)/(x+4)
----------------------------
 type: string
 name: y
value: (x^2+2)/(x+4)
value_computed: 1
--------------------
>> x=y
----------------------------
 type: string
 name: x
value: (y)
value_computed: 1
--------------------
>> y=(x^2+2)/(x+4)
----------------------------
 type: string
 name: y
value: (x^2+2)/(x+4)
value_computed: 0.6
--------------------
>> y
in> (0.6)

out> 0.6

------------------------


即得到

\[
a_1=2,\quad a_2=1,\quad a_3=\frac{3}{5},\quad a_4=\frac{59}{115}
\]


在 Calculator v0.537 版本中已经添加了函数 printRecursiveSeries()

>> printRecursiveSeries((n^2+2)/(n+4),n,2,10,\n)
in> printRecursiveSeries((n^2+2)/(n+4),n,2,10,\n)
1
0.6
0.51304348
0.50148278
0.50016519
0.50001836
0.50000204
0.50000023
0.50000003
0.50000000


------------------------

>> :mode=fraction
Switch into fraction calculating mode.
e.g., 1/2+1/3 will return 5/6

>> printRecursiveSeries((n^2+2)/(n+4),n,2,10,\n)
in> printRecursiveSeries((n^2+2)/(n+4),n,2,10,\n)
1
3|5
59|115
9977|19895
891162579|1781736515
7143340759978621691|14286156943343253085
153071959210947077593344209777606577977|306142669345391339033273867001310578545
210877692684521073632686796614427621177608849307584544993392729791345410046579|421755194170454656838715623548179223078639124055129803382668276046037982971565
400224288891463132245588513262675832580155294150347514542265716671466587416216808432328845025373819376120940561495311696075422019773351889910473522146701691|800448537463409289970468912605629751484284184673346880817551678682345444242416699895610264410961644842938069217110623535798264962551964970919962105876723035
480538401224433076914322107044892889273619273662533194150556851587360737976789610786946600683365362655087382494630247466268531496887249965680481862880481156186674147551392766374398353649598099830434467531101824929956726062281597466600813520823786097638583908474247882847900409669162905195171606419138016780493977|961076797069916150637035067794869620082760044754356287427841416504669963950089965195105960796484833842639813529070119301247099221843344998442808673021667792117820296445588510208551637135412798708771976135899044690996631347449387596569472159842757832149769436510643469544737024421672111730371918134099365723865695


------------------------


需要能处理复杂的递推关系, 比如

\[
\begin{cases}
a_n&=2a_{n-1}+2a_{n-2},\\
a_1&=3,\\
a_2&=8.
\end{cases}
\]

19. [DevPlan] 雅可比符号

Posted by haifeng on 2023-02-03 10:32:38 last update 2023-02-11 17:11:30 | Answers (0) | 收藏


雅可比符号

雅可比符号 $\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$ 并非素数, 此时需要将 $p$ 进行因子分解.

 


Version: 0.536 已经实现 Jacobi(a,p) 函数.

<[1] [2] [3] >