2007/07/19

こんちわ。

久しぶりの投稿になってしまいました。
無事にNAS2007での発表も終わり、
本格的に研究を進めています。

まずはテストプログラムをC言語に翻訳しました。(今日までに終了)
今日はそのプログラムを公開します。
FORTRAN⇔C言語の翻訳は大変でした。

初めての大型プログラムなので、汚いですが
頑張ったので載せます。

//-------------------------------------------------------------------------C
// 2007/06/28 Akitoshi Takayasu
// 係数の算出(mod f(θ))
// Test program for Function Multiplication and Reduction
// File name = KEISU.c
//-------------------------------------------------------------------------C
#include
#define ND 101

FILE *fp1, *fp2;
int N, i, j, k, NV;
double C[3], A[3], B[3][ND];
double A1, A2, B1, B2;

//=========================================================================C
void KEISU(){
//=========================================================================C
// Function Multiplication and Reduction
// f(X) = A[0]*X*X + A[1]*X + A[2]
// F(X) = (B[1][1]*X + B[2][1])*...*(B[1][N]*X + B[2][N])
// g(X) = C[1]*X + C[2]
// g(X) = F(X) mod f(X)
//-------------------------------------------------------------------------C

/*
// Input
puts("N(=イデアルの個数),A(0)*X**2+A(1)*X+A(2)");
puts("(B(1,1)*X+B(2,1))*...*(B(1,N)*X+B(2,N))を入力してください。");
scanf_s("%d",&N);
for(i=0; i<=2; i++){
scanf_s("%lf",&A[i]); printf("A(%d)=%lf\n",i,A[i]); } for(j=1; j<=N; j++){ scanf_s("%lf",&B[1][j]); scanf_s("%lf",&B[2][j]); printf("B(1)(%d)=%lf\n",j,B[1][j]); printf("B(2)(%d)=%lf\n",j,B[2][j]); } */ // First Multiplication if(N%2 == 1){ C[1]=A[0]*B[1][1]; C[2]=A[0]*B[2][1]; }else{ C[1]=B[1][1]; C[2]=B[2][1]; } //printf("A(1)=%lf,A(2)=%lf\n",A[1],A[2]); // Main Loop for(k=2; k<=N; k++){ A1=C[1]; A2=C[2]; B1=B[1][k]; B2=B[2][k]; C[1]=A[0]*A2*B1 + A1*(A[0]*B2-B1*A[1]); C[2]=A[0]*A2*B2 - A1*B1*A[2]; } //printf("C(1)=%f,C(2)=%f\n",C[1],C[2]); } main(){ // Initial Set for A /*puts("A(0)*X**2+A(1)*X+A(2)の係数を入力"); for(i=0; i<=2; i++){ scanf_s("%lf",&A[i]); printf("A(%d)=%f\n",i,A[i]); }*/ A[0]=2; A[1]=0; A[2]=-27; // File Open and Read fp1 = fopen("INFunc.txt","r"); fp2 = fopen("OutFunc.txt","w"); while(100){ if(fscanf(fp1,"%d",&N)==EOF) {break;} //fprintf(fp2,"%d, \n",N); for(i=1; i<=N; i++){ fscanf(fp1,"%lf",&B[1][i]); fscanf(fp1,"%lf",&B[2][i]); //fprintf(fp2,"%lf, %lf,\n",B[1][i],B[2][i]); } //fprintf(fp2,"\n"); // Computation Function KEISU(); NV = (N-1)/2; // Output fprintf(fp2,"%17.0f%17.0f%5d\n",C[1],C[2],NV); } }

これはふるいで得られたデータをもとに modをとり次数を落としていきます。代数平方根の計算のステップ1です。

0 件のコメント: