我已经搜索了一些关于如何在C 程序中使用 PARI 库的教程,但不幸的是,我只找到了在命令行界面中使用 GP 包的通用教程。
有人可以帮忙吗?例如,我想初始化一个 3x3 矩阵并找到它的 1000 次幂。在 gp(CLI)中,这可以通过键入以下内容来实现:
? A=[1,2,3;4,5,6;7,8,9]
? A^1000
Run Code Online (Sandbox Code Playgroud)
但是我发现在C 源文件中做这个安静简单的事情没有帮助。是否有提供此类示例的综合教程或文档?任何评论将不胜感激!
如何在PARI/GP中创建跨越每个级别多行的嵌套循环?我经常需要在循环中做多个事情,为了便于阅读,我不喜欢在一行上编写循环.对于一个变量的循环,我一直这样做:
for(i=1,10,{
printf("%u\n",i);
})
Run Code Online (Sandbox Code Playgroud)
但是,对于嵌套循环,我只设法将换行符放在一个级别.这有效:
for(i=1, 10, for(j=1, 10, {
printf("%2u\t%2u\n", i, j);
}));
Run Code Online (Sandbox Code Playgroud)
这也有效:
for(i=1, 10, {
for(j=1, 10, printf("%2u\t%2u\n", i, j));
});
Run Code Online (Sandbox Code Playgroud)
但是,这是我真正想做的事情:
for(i=1, 10, {
for(j=1, 10, {
printf("%2u\t%2u\n", i, j);
});
});
Run Code Online (Sandbox Code Playgroud)
最后一个例子不起作用; 它给出了一个错误:
*** sorry, embedded braces (in parser) is not yet implemented.
... skipping file 'nested_for.gp'
*** at top-level: printf("%2u\t%2u\n",
*** ^--------------------
*** printf: not a t_INT in integer format conversion: i.
*** Break loop: type 'break' to go back to GP
Run Code Online (Sandbox Code Playgroud)
我在OS X …
我想从Python 调用PARI/GP来计算我定义的nextprime(n)不同ns 的函数.不幸的是我无法安装pari-python所以我想我只是os.system在Python中使用命令行来调用它.但是,我在手册页中看不到如何让PARI/GP以非交互模式运行.有没有办法实现这个目标?
假设我在 PARI/GP 中有一个包含 n 个元素的向量。
我想从 n 个元素中生成 k 个组合。
例如,如果向量为 [3,7,11,14,18] 且 k=3,则输出应为
[3,7,11]
[3,7,14]
[3,7,18]
[3,11,14]
[3,11,18]
[3,14,18]
[7,11,14]
[7,11,18]
[7,14,18]
[11,14,18]
Run Code Online (Sandbox Code Playgroud)
PARI/GP 中是否有命令执行此操作,或者我是否必须对该功能进行编程?
模乘逆元是一个整数 \xe2\x80\x98x\xe2\x80\x99 使得。
\nax \xe2\x89\xa1 1 (mod m)。
\n那么,有什么方法可以计算 pari\\gp 计算器中的模乘法逆元吗?
\n如果这个问题微不足道或重复,我真的很抱歉。
\n我使用长度为N的自然数向量和条目总和S,例如,(N,S)=(4,7)一个示例向量 E=[1,2,1,3] 其中所有条目向量中假设> 0。
我想列出具有相同配置(N,S)=(4,7)的所有向量,但应过滤掉旋转。
问题:最好的算法是什么?
(我的实际实现是在 Pari/GP 中,它提供了一个嵌套的 for 循环,使用下限和上限索引值的边界向量)
我首先尝试了一个“强力”解决方案,因为我使用嵌套的 for 循环生成一个列表,但将向量连接的双重concat(E,E)存储在列表EE[]中,然后,对于每个新向量E=[e_1,e_2,e_3,e_4]检查该向量是否出现在已检查列表EE[]中的串联向量中,如果没有则将其附加为新的有效条目
EE[k]=E||E = [e_1,e_2,e_3,e_4,e_1,e_2,e_3,e_4]。这里的比较就像字符串比较 - 如果匹配从位置1开始或直到N ,则始终会找到匹配。
这种方法有效,但在我看来有点像蛮力,并且由于其组合结构随着N和S的增加而爆炸。
是否存在更好的方法?
注意:目标语言是Pari/GP
注意:伪算法就足够了 - 但也许 Pari/GP 中的工具允许一些更紧凑的解决方案/符号。
示例,(N,S)=(4,7)
下面是一个非常简单的示例。
假设通过嵌套循环我通过以下方式获得向量E :
[1,1,1,4] --- first vector: store as [1,1,1,4;1,1,1,4] in EE
[1,1,2,3] --- 2nd vector: not in EE so far, append …Run Code Online (Sandbox Code Playgroud) 我已经定义了 arity 1 的几个函数,比如说func1(-)和func2(-)。我已经对它们进行了测试,并看到它们实际上做了它们应该做的事情。
我希望定义第三个功能,也就是说func3(-),输出的差异func1(-)和func2(-)。这就是我所做的
func3(k) = {j=func1(k)-func2(k); print(j)}
Run Code Online (Sandbox Code Playgroud)
尽管如此,它并没有返回它应该返回的内容。让我们假设func1(5)输出 10 和func2(5)输出 2。那么,func3(5)应该输出 8,对吗?它返回func1(5)一行中的输出,func2(2)另一行中的输出,然后是零(即使相应输出的差异不是 0)。
你知道定义有func3(-)什么问题吗?
如何在PARI / GP中声明和调用数组?
例如,我在Java中具有以下内容:
int[] myArray = new int[5];
for(int i = 0; i < 5; i++){
myArray[i] = i + 5;
}
Run Code Online (Sandbox Code Playgroud)
使用PARI / GP时我该怎么做?
我编写了一个 cpp 源代码,其中包含 pari.h 头文件:
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<iterator> // for ostream_iterator
#include<strings.h>
#include<string.h>
#include<sstream>
#include <pari/pari.h> // for PARI/GP library
#include<Rcpp.h> // for sourceCpp to work, this line must be uncommented
// Enable C++11 via this plugin (Rcpp 0.10.3 or later)
// [[Rcpp::plugins(cpp11)]]
using namespace std;
using namespace Rcpp; // for sourceCpp to work, this line must be uncommented
// [[Rcpp::export]]
int main() {
long maxp = 1000000; // max value
pari_init(500000,2); // initiate pari
size_t …Run Code Online (Sandbox Code Playgroud) 我正在使用在 ASUS x75 上运行的 GP 和最小多项式,如下所示:
(19:25) gp > elt=Mod(a*x^3+b*x^2+c*x+d,('x^5-1)/('x-1))
%122 = Mod(a*x^3 + b*x^2 + c*x + d, x^4 + x^3 + x^2 + x + 1)
(19:25) gp > (poly=minpoly(elt,x='x))
%123 = x^4 + (a + (b + (c - 4*d)))*x^3 + (a^2 + (-3*b + (2*c - 3*d))*a + (b^2 + (2*c - 3*d)*b + (c^2 - 3*d*c + 6*d^2)))*x^2 + (a^3 + (-2*b + (3*c - 2*d))*a^2 + (-2*b^2 + (c + 6*d)*b + (-2*c^2 - …Run Code Online (Sandbox Code Playgroud) 这可能是一个非常愚蠢的问题——但我似乎无法在 pari-gp 文献中找到相关的解释。我正在库中寻找一个函数,它接受多项式、级数或常数,并吐出常数部分(在常数情况下,它只会吐出输入)。
我一直在使用的工具是,polcoef(Expression,0)但这不适用于多个变量——我们必须再次调用该函数。
例如,
polcoef(1+z+z^2,0)
%2 = 1
polcoef(1+y+z,0)
%3 = z + 1
polcoef(polcoef(1+y+z,0),0)
%4 = 1
Run Code Online (Sandbox Code Playgroud)
是否有一个内置函数可以对任意数量的变量执行此操作?这样,我就不必迭代该polcoef函数了。这将大大清理我的代码;我知道我可能可以自己构建一个递归函数,但我想知道是否有内置的东西可以做到这一点。
非常感谢任何帮助、评论、编辑和澄清请求。
问候。
编辑:
忘记添加,我想要的输出是,
Const(1+x+y+z)
1
Const(Pi+x^2+p)
Pi
Run Code Online (Sandbox Code Playgroud) 我想将 Pari/GP p-adic 数的元素提取到向量中。即,如果这是我的 p 进数:
O(5^8)+1/3
> 2 + 3*5 + 5^2 + 3*5^3 + 5^4 + 3*5^5 + 5^6 + 3*5^7 + O(5^8)
Run Code Online (Sandbox Code Playgroud)
我希望能够提取这样的向量:
[2,3,1,3,1,3,1,3]
Run Code Online (Sandbox Code Playgroud)
有没有直接的方法来做到这一点还是我必须编写自己的函数?
pari-gp ×12
pari ×8
arrays ×1
c ×1
filtering ×1
function ×1
gcc ×1
linux ×1
nested-loops ×1
polynomials ×1
python ×1
r ×1
rcpp ×1
stack-size ×1