hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1067|回复: 5

PARI/GP的一些笔记

[复制链接]

523

主题

523

帖子

1599

积分

大司空

Rank: 5Rank: 5

积分
1599
发表于 2023-11-23 11:16:46 | 显示全部楼层 |阅读模式
在我没写完前,所有回复帖子一律删除
1、通用设置、常量、类型
1)提高默认堆栈容量
执行目录下有个gprc.txt
加入parisizemax = 100000000
可明显减少对大数进行复杂运算时候报堆栈错误的可能

2) 默认实数的精度
交互环境下输入\p 1000 可提高默认的实数精度,
也可以在gprc.txt里增加 realprecision = 1000
实际的精度要比输入值略大,以符合机器字的整数倍数
推荐gprc.txt默认精度不要太大,否则一次显示不全,也没必要
需要时候临时用\p 10000这种调节

3)启用计时器
交互环境下,输入#回车即可启用计时器,每次执行命令结果都会附加执行时间
再输入一次#即可关闭
##显示最后一次的执行时间

4)交互环境下,执行结果会存入%开始后跟数字的变量里
GP>x=1
%1=1
GP>y=2
%2=2
这些变量可以在输入中直接使用,
特别的单独的%代表最后一次的值

5)在线帮助
输入?会显示帮助列表,? n显示对应主题帮助
? function 会显示function函数的帮助
?? function 是更详细的function帮助
??? function 是所有和function有关联的函数清单
?\ 是显示快捷键的列表,比如#,##等
?. 是显示相关类型的成员函数


6)常见的常量
Pi 圆周率
oo 正无穷
-oo 负无穷
I 虚数单位i
Euler 欧拉常数
Catalan 卡塔兰常数

7)类型
回复

使用道具 举报

0

主题

205

帖子

49

积分

新手上路

Rank: 1

积分
49
发表于 2023-11-23 11:17:18 | 显示全部楼层
2、函数定义和常见函数
1)定义

gp > f(x)=x^2+1
%1 = (x)->x^2+1
gp > f(3)
%2 = 10

gp > f(x,y)=x+y
%3 = (x,y)->x+y
gp > f(i,5)
%4 = i + 5

也可以定义多行函数,每行用;结束即可,函数值是最后一行的结果

g(x) = y = x^2; z = y % 9;
g(7)
  4

如果在某些需要seq参数的函数中,这些行需要用{}括起来
回复

使用道具 举报

0

主题

198

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-11-23 11:18:13 | 显示全部楼层
2) if
if(a, seq1)
如果 a != 0 执行seq1
if(a, seq1, seq2)
如果 a != 0 执行seq1,否则执行seq2
if(a1, seq1,
   a2, seq2.
   .....
    defaultseq)
这个执行多个判定条件,类似连续的if判断
所有条件都不满足的话,执行最后的默认seq
回复

使用道具 举报

0

主题

174

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-11-23 11:18:39 | 显示全部楼层
3) for
for(x=a, b, seq)
a, b是实数,从a 到 b 执行 seq, 步长是1
如果 a > b 则不执行
如果b 是 +∞,则循环是无限循环

GP > for(x=2.5, 3, print(x))
2.5

GP > for(x=2.5, 4, print(x))
2.5
3.5

可以用break跳出循环
GP> for(i=1,100,{print(i); if(i>=10,break())})
1
2
3
4
5
6
7
8
9
10

其他for函数:
forcomposite(n = a, b, seq)
对[a, b] 区间的合数执行 seq
gp > forcomposite(a=2, 10,print(a))
4
6
8
9
10

foroprime(n = a, b, seq
对[a, b] 区间的素数执行 seq
gp > forprime(n=2,10, print(n))
2
3
5
7

fordiv(n, d, seq)
对n的因子d执行 seq
gp > fordiv(100, d, print(d))
1
2
4
5
10
20
25
50
100

fordivfactored(n, d, seq)
对n进行分解,然后对n的所有因子和因子的分解执行seq

gp > fordivfactored(24, d, print(d))
[1, matrix(0,2)]
[2, Mat([2, 1])]
[3, Mat([3, 1])]
[4, Mat([2, 2])]
[6, [2, 1; 3, 1]]
[8, Mat([2, 3])]
[12, [2, 2; 3, 1]]
[24, [2, 3; 3, 1]]
gp > fordivfactored(24, d, print(eulerphi(d)))
1
1
2
2
2
4
4
8

forfactored(n = a, b, seq)
从a到b,对n和n的分解执行seq
gp > forfactored(n=2,10, print(n))
[2, Mat([2, 1])]
[3, Mat([3, 1])]
[4, Mat([2, 2])]
[5, Mat([5, 1])]
[6, [2, 1; 3, 1]]
[7, Mat([7, 1])]
[8, Mat([2, 3])]
[9, Mat([3, 2])]
[10, [2, 1; 5, 1]]

foreach(v, x, seq)
对v中每个元素x执行seq, v的类型是t_LIST, t_VEC,t_COL, t_MAT
如果类型是t_MAT,x是矩阵的行
gp > foreach(factor(24), d, print(d))
[2, 3]~
[3, 1]~
回复

使用道具 举报

0

主题

171

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-11-23 11:18:52 | 显示全部楼层
4)while
while(a, seq)
当a不为0时候,执行seq,直到a是0

gp > x=1;while(x<=10, {print(x);x=x+1});
1
2
3
4
5
6
7
8
9
10

注意,
如果a永远为1,将无限循环seq
如果a一开始为0,则不执行seq
回复

使用道具 举报

0

主题

173

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2023-11-23 11:19:15 | 显示全部楼层
5) until
until(a, seq)
执行seq直到a为1
需要注意的是,seq会至少执行一次

gp > x=1;until(x>0, {print(x);x=x+1});
1
gp > x=1;until(x>10, {print(x);x=x+1});
1
2
3
4
5
6
7
8
9
10

until 和 while 是相反的条件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 04:04 , Processed in 0.060891 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表