Pari/GPからCへ変換・・・
Pari/GPからCへ変換・・・
Pari/GPという計算ソフトを用いて作られたプログラムをCに変換できる人いませんでしょうか?
先日尋ねられたのですが、わたしはどちらも詳しくないので教えて頂きたいと思います。
元のプログラムは、、、
{
n=6;
g=matrix(n,n);
gs=matrix(n,n);
m=matrix(n,n);
u=matrix(n,n);
h=matrix(n,n);
c=0;
"====================step1====================";
g[1,]=[1,0,0,0,0,-21];
g[2,]=[0,1,0,0,0,-5];
g[3,]=[0,0,1,0,0,-10];
g[4,]=[0,0,0,1,0,-20];
g[5,]=[0,0,0,0,1,-24];
g[6,]=[0,0,0,0,0,49];
print("--------------------step1--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(msg[s,]));
print("");print("");
"====================step2====================";
gs[1,]=g[1,];
u[1,1]=1;
for(i=2,n,gs[i,]=g[i,];
for(j=1,i-1,uu=g[i,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[i,j]=uu/us;
gs[i,]=gs[i,]-u[i,j]*gs[j,]
);
u[i,i]=1;
);
m=u;
print("--------------------step2"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs*m*gs;
for(s=1,n,print(mgs[s,]));
print("");
i=2;
print("i=",2);
print("");
print("");
u=m;
"====================step3====================";
while(i<=n,
j=i-1;
while(j>0,
g[i,]=g[i,]-round(u[i,j])*g[j,]);
m[i,]=m[i,]-round(u[i,j])*m[j,]);
u[i,]=m[i,];
j=j-1;
print("--------------------step3"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");print("");
);
if((i>1&&(gs[i-1,]*gs[i-1,]~>2*gs[i,]*gs[i,]~),
h[i,]=g[i,];g[i,]=g[i-1,];g[i-1,]=h[i,];
mi=i-1;
for(ii=mi,n,
gs[ii,]=g[ii,];
for(j=1,ii-1,
uu=g[ii,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[ii,j]=uu/us;
gs[ii,]=gs[ii,]-u[ii,j]*gs[j,]
);
u[ii,ii]=1;
);
i=i-1,
i=i+1
);
m=u;
print("--------------------step3(b)--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");
print("i=",i);
print("");print("");
);
print("====================Finish====================");
print("G=");
for(s=1,n,print(g[s,]));
print("==============================================");
}
ちょっと長いですがこういうプログラムです。
どうかお願い致します!
先日尋ねられたのですが、わたしはどちらも詳しくないので教えて頂きたいと思います。
元のプログラムは、、、
{
n=6;
g=matrix(n,n);
gs=matrix(n,n);
m=matrix(n,n);
u=matrix(n,n);
h=matrix(n,n);
c=0;
"====================step1====================";
g[1,]=[1,0,0,0,0,-21];
g[2,]=[0,1,0,0,0,-5];
g[3,]=[0,0,1,0,0,-10];
g[4,]=[0,0,0,1,0,-20];
g[5,]=[0,0,0,0,1,-24];
g[6,]=[0,0,0,0,0,49];
print("--------------------step1--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(msg[s,]));
print("");print("");
"====================step2====================";
gs[1,]=g[1,];
u[1,1]=1;
for(i=2,n,gs[i,]=g[i,];
for(j=1,i-1,uu=g[i,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[i,j]=uu/us;
gs[i,]=gs[i,]-u[i,j]*gs[j,]
);
u[i,i]=1;
);
m=u;
print("--------------------step2"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs*m*gs;
for(s=1,n,print(mgs[s,]));
print("");
i=2;
print("i=",2);
print("");
print("");
u=m;
"====================step3====================";
while(i<=n,
j=i-1;
while(j>0,
g[i,]=g[i,]-round(u[i,j])*g[j,]);
m[i,]=m[i,]-round(u[i,j])*m[j,]);
u[i,]=m[i,];
j=j-1;
print("--------------------step3"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");print("");
);
if((i>1&&(gs[i-1,]*gs[i-1,]~>2*gs[i,]*gs[i,]~),
h[i,]=g[i,];g[i,]=g[i-1,];g[i-1,]=h[i,];
mi=i-1;
for(ii=mi,n,
gs[ii,]=g[ii,];
for(j=1,ii-1,
uu=g[ii,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[ii,j]=uu/us;
gs[ii,]=gs[ii,]-u[ii,j]*gs[j,]
);
u[ii,ii]=1;
);
i=i-1,
i=i+1
);
m=u;
print("--------------------step3(b)--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");
print("i=",i);
print("");print("");
);
print("====================Finish====================");
print("G=");
for(s=1,n,print(g[s,]));
print("==============================================");
}
ちょっと長いですがこういうプログラムです。
どうかお願い致します!
Re:Pari/GPからCへ変換・・・
mathematicaでもいいのですが、できればCでやってみたいと思いまして・・・。
最初はCを考えていたのですが、プログラムのCPUを考えたら、mathematicaの方が効率的なのかもしれない、、、とも思いました。
どちらかで実行できるのであればどちらでも構わないです!
最初はCを考えていたのですが、プログラムのCPUを考えたら、mathematicaの方が効率的なのかもしれない、、、とも思いました。
どちらかで実行できるのであればどちらでも構わないです!
Re:Pari/GPからCへ変換・・・
GPスクリプトをCのソースに変換するツール
gp2cというのがあるみたいです。あたしは使ったことありませんが…。
「gp2c」でググってみてくださいまし。
gp2cというのがあるみたいです。あたしは使ったことありませんが…。
「gp2c」でググってみてくださいまし。
Re:Pari/GPからCへ変換・・・
すみませんが、見たことがないです・・・。
もう拝見されてるとは思いますがboxさんのおっしゃっている部分で参考になりそうな
URLです。
http://www.kaynet.or.jp/~kay/misc/column/parigp3.html
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
もう拝見されてるとは思いますがboxさんのおっしゃっている部分で参考になりそうな
URLです。
http://www.kaynet.or.jp/~kay/misc/column/parigp3.html
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
Re:Pari/GPからCへ変換・・・
ありがとうございます。
そのリンクは使えそうなのですが、問題は環境で、windows上で実行できないとだめなんです。。。
gp2cはunixでしかだめと書いてあったので。。
そのリンクは使えそうなのですが、問題は環境で、windows上で実行できないとだめなんです。。。
gp2cはunixでしかだめと書いてあったので。。
Re:Pari/GPからCへ変換・・・
管理人さんが挙げた
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
こちらの方にWindows用バイナリへのリンクがはってありますけど、それではだめですか?
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
こちらの方にWindows用バイナリへのリンクがはってありますけど、それではだめですか?
Re:Pari/GPからCへ変換・・・
installして手順通りにやってみたのですが、最初からつまづいて・・・
わたしのPCでは動かなかったのです。
もしかするとやり方が間違っていたのかもしれませんが。。。
わたしのPCでは動かなかったのです。
もしかするとやり方が間違っていたのかもしれませんが。。。
Re:Pari/GPからCへ変換・・・
これだけの情報では状況がよくわからないです。
まずインストールしたのは Pari/GPでしょうか? gp2cでしょうか?
>手順通りにやってみたのですが、最初からつまづいて・
えーと、手順というのは公式サイトのhttp://pari.math.u-bordeaux.fr/pub/pari ... /gp2c.htmlですか?
その最初というのは具体的には何をしようとしたのでしょうか?
>わたしのPCでは動かなかったのです
動かなかいというのは、動かせる状態にまではもって行けた、ということでしょうか??
まずインストールしたのは Pari/GPでしょうか? gp2cでしょうか?
>手順通りにやってみたのですが、最初からつまづいて・
えーと、手順というのは公式サイトのhttp://pari.math.u-bordeaux.fr/pub/pari ... /gp2c.htmlですか?
その最初というのは具体的には何をしようとしたのでしょうか?
>わたしのPCでは動かなかったのです
動かなかいというのは、動かせる状態にまではもって行けた、ということでしょうか??
Re:Pari/GPからCへ変換・・・
インストールしたのはPari/GPで、gp2cはDLしました。
DLの後に、公式サイトのインストール手順通りにやってみようとしたのですが、Pari/GP上で最初の項目からエラーが出てしまいます。
つまり、gp2cをインストール出来ていないという結果です・・・gp2cの解凍したところ止まりです。
これまでPari/GPを使ったことがないので意味がよく分かりませんでした。
DLの後に、公式サイトのインストール手順通りにやってみようとしたのですが、Pari/GP上で最初の項目からエラーが出てしまいます。
つまり、gp2cをインストール出来ていないという結果です・・・gp2cの解凍したところ止まりです。
これまでPari/GPを使ったことがないので意味がよく分かりませんでした。
Re:Pari/GPからCへ変換・・・
やりたいの gpコードを cソースに直したいのですよね?
まず必要なのは gp2cです。
これを Windows上で使う場合、ビルドの為に Cygwinが必要です(Linuxなら不要)。
Cygwin 環境の構築:Cygwin Setupによるインストール
http://sohda.net/cygwin/setup.html
このあたり(もしくは Cygwinでググって出てきたサイト)でも参考にして、まずこれをインストールして下さい。
これが終わったら公式サイトの gp2cのインストール手順("1.1 Installing gp2c")をみながら、
tar.gzの解凍をし、configureによる環境チェックを経て、makeすればコンパイルできるはずです。
configureの段階でエラーが出るような、大抵そのコマンドがインストールされていないということなので、その場合は Cygwin Setupで必要なモジュールを追加して下さい。
ビルドが終われば後は
>gp2c xxxx.gp > xxxx.c
と gpソースと出力ファイル名をリダイレクトで指定すれば出力されます。
で、このソースコードをCコンパイラでビルドするには Pari/GPが必要で、こちらは Windows用のものがあるのでさくっとインストールしてパスを通せば、コンパイルできるのではないでしょうか。
まず必要なのは gp2cです。
これを Windows上で使う場合、ビルドの為に Cygwinが必要です(Linuxなら不要)。
Cygwin 環境の構築:Cygwin Setupによるインストール
http://sohda.net/cygwin/setup.html
このあたり(もしくは Cygwinでググって出てきたサイト)でも参考にして、まずこれをインストールして下さい。
これが終わったら公式サイトの gp2cのインストール手順("1.1 Installing gp2c")をみながら、
tar.gzの解凍をし、configureによる環境チェックを経て、makeすればコンパイルできるはずです。
configureの段階でエラーが出るような、大抵そのコマンドがインストールされていないということなので、その場合は Cygwin Setupで必要なモジュールを追加して下さい。
ビルドが終われば後は
>gp2c xxxx.gp > xxxx.c
と gpソースと出力ファイル名をリダイレクトで指定すれば出力されます。
[color=#d0d0ff" face="monospace]f(a)=
{
local(x,y=1);
x=[1,[1,1],[1,a]];
while(x[if(a,3,2)]!=[1,y],y++;print(y));
print("end");
}
g(a)=
{
local(x,y=1);
x=[1,[1,1],[1,a]];
until(x[if(a,3,2)]!=[1,y],y++;print(y));
print("end");
}
[/color]
このような gpソースが[color=#d0d0ff" face="monospace]#include <pari/pari.h>
void
init_while(void) /* void */
{
return;
}
void
f(GEN a) /* void */
{
GEN x = gen_0, y = gen_1;
GEN p1, p2, p3; /* vec */
p1 = cgetg(4, t_VEC);
gel(p1, 1) = gen_1;
p2 = cgetg(3, t_VEC);
gel(p2, 1) = gen_1;
gel(p2, 2) = gen_1;
gel(p1, 2) = p2;
p3 = cgetg(3, t_VEC);
gel(p3, 1) = gen_1;
gel(p3, 2) = gcopy(a);
gel(p1, 3) = p3;
x = p1;
{
long l4;
GEN p5; /* vec */
for(;;)
{
if (!gcmp0(a))
l4 = 3;
else
l4 = 2;
p5 = cgetg(3, t_VEC);
gel(p5, 1) = gen_1;
gel(p5, 2) = gcopy(y);
if (gequal(gel(x, l4), p5))
break;
y = gaddgs(y, 1);
pariprintf("%Z\n", y);
}
}
pariprintf("end\n");
return;
}
void
g(GEN a) /* void */
{
GEN x = gen_0, y = gen_1;
GEN p1, p2, p3; /* vec */
p1 = cgetg(4, t_VEC);
gel(p1, 1) = gen_1;
p2 = cgetg(3, t_VEC);
gel(p2, 1) = gen_1;
gel(p2, 2) = gen_1;
gel(p1, 2) = p2;
p3 = cgetg(3, t_VEC);
gel(p3, 1) = gen_1;
gel(p3, 2) = gcopy(a);
gel(p1, 3) = p3;
x = p1;
{
long l4;
GEN p5; /* vec */
for(;;)
{
y = gaddgs(y, 1);
pariprintf("%Z\n", y);
if (!gcmp0(a))
l4 = 3;
else
l4 = 2;
p5 = cgetg(3, t_VEC);
gel(p5, 1) = gen_1;
gel(p5, 2) = gcopy(y);
if (!gequal(gel(x, l4), p5))
break;
}
}
pariprintf("end\n");
return;
}[/color]
のように出力されます。で、このソースコードをCコンパイラでビルドするには Pari/GPが必要で、こちらは Windows用のものがあるのでさくっとインストールしてパスを通せば、コンパイルできるのではないでしょうか。