Pari/GPからCへ変換・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nana

Pari/GPからCへ変換・・・

#1

投稿記事 by nana » 18年前

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("==============================================");

}

ちょっと長いですがこういうプログラムです。
どうかお願い致します!

box

Re:Pari/GPからCへ変換・・・

#2

投稿記事 by box » 18年前

MathematicaではなくてC言語に変換したいのですか?

http://okwave.jp/qa2600276.html

nana

Re:Pari/GPからCへ変換・・・

#3

投稿記事 by nana » 18年前

mathematicaでもいいのですが、できればCでやってみたいと思いまして・・・。
最初はCを考えていたのですが、プログラムのCPUを考えたら、mathematicaの方が効率的なのかもしれない、、、とも思いました。
どちらかで実行できるのであればどちらでも構わないです!

box

Re:Pari/GPからCへ変換・・・

#4

投稿記事 by box » 18年前

GPスクリプトをCのソースに変換するツール
gp2cというのがあるみたいです。あたしは使ったことありませんが…。
「gp2c」でググってみてくださいまし。

nana

Re:Pari/GPからCへ変換・・・

#5

投稿記事 by nana » 18年前

試してみようと思ったのですが、よく分かりませんでした>_<
何か方法、もしくは変換できる方いらっしゃいませんでしょうか・・・?

管理人

Re:Pari/GPからCへ変換・・・

#6

投稿記事 by 管理人 » 18年前

すみませんが、見たことがないです・・・。

もう拝見されてるとは思いますがboxさんのおっしゃっている部分で参考になりそうな
URLです。

http://www.kaynet.or.jp/~kay/misc/column/parigp3.html
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html

nana

Re:Pari/GPからCへ変換・・・

#7

投稿記事 by nana » 18年前

ありがとうございます。
そのリンクは使えそうなのですが、問題は環境で、windows上で実行できないとだめなんです。。。
gp2cはunixでしかだめと書いてあったので。。


mas

Re:Pari/GPからCへ変換・・・

#9

投稿記事 by mas » 18年前

管理人さんが挙げた
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
こちらの方にWindows用バイナリへのリンクがはってありますけど、それではだめですか?

nana

Re:Pari/GPからCへ変換・・・

#10

投稿記事 by nana » 18年前

う”---ん、、、やっぱり動きませんでした。。。
変換は無理なんでしょうか・・・

Justy

Re:Pari/GPからCへ変換・・・

#11

投稿記事 by Justy » 18年前

やっぱり動きませんでした
 何をしたけど、何が問題でどう動かなかったのでしょうか。

nana

Re:Pari/GPからCへ変換・・・

#12

投稿記事 by nana » 18年前

installして手順通りにやってみたのですが、最初からつまづいて・・・
わたしのPCでは動かなかったのです。
もしかするとやり方が間違っていたのかもしれませんが。。。

Justy

Re:Pari/GPからCへ変換・・・

#13

投稿記事 by Justy » 18年前

 これだけの情報では状況がよくわからないです。

 まずインストールしたのは Pari/GPでしょうか? gp2cでしょうか?

手順通りにやってみたのですが、最初からつまづいて・
 えーと、手順というのは公式サイトのhttp://pari.math.u-bordeaux.fr/pub/pari ... /gp2c.htmlですか?
 
 その最初というのは具体的には何をしようとしたのでしょうか?


わたしのPCでは動かなかったのです
 動かなかいというのは、動かせる状態にまではもって行けた、ということでしょうか??

nana

Re:Pari/GPからCへ変換・・・

#14

投稿記事 by nana » 18年前

インストールしたのはPari/GPで、gp2cはDLしました。
DLの後に、公式サイトのインストール手順通りにやってみようとしたのですが、Pari/GP上で最初の項目からエラーが出てしまいます。
つまり、gp2cをインストール出来ていないという結果です・・・gp2cの解凍したところ止まりです。
これまでPari/GPを使ったことがないので意味がよく分かりませんでした。

Justy

Re:Pari/GPからCへ変換・・・

#15

投稿記事 by Justy » 18年前

 やりたいの 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ソースと出力ファイル名をリダイレクトで指定すれば出力されます。

[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用のものがあるのでさくっとインストールしてパスを通せば、コンパイルできるのではないでしょうか。

閉鎖

“C言語何でも質問掲示板” へ戻る