• 締切済み

再帰式

$Q_k(n,d)=\displaystyle \sum^{[n/k]}_{i=1}\left[\displaystyle \frac{n!d!}{d^{ik}i!(k!)^i(n-ik)!(d-i)!} \displaystyle \sum^{k-1}_{j=1}Q_j(n-ik,d-i)\displaystyle \frac{(d-i)^{n-ik}}{d^{n-ik}}\right]$ ってどうやって計算式をプログラムすればよいのでしょうか。 全く手がつけられません。 ※Texのコマンドで打ち込んであります。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

えっと.... Σ_(k=1)^n k^2 はできますか? (「それは n(n+1)(2n+1)/6」という以下略). 和を変数 s に入れることにすると, s=0; for (k=1; k <= n; ++k) s += k*k; で計算できますね. これを (かなり) 拡張するだけです. 和の [~] を計算する関数を 1つ作っておくと見やすいかもしれない.

Shauetsu
質問者

お礼

ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

たとえば Σ_(i=1)^k k!/[(k-i)! i!] をどうやって計算すればいいかはわかりますか? 「それは 2^k-1」という突っ込みは却下.

Shauetsu
質問者

補足

すみません。まったく分からないです。。。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

Texのコマンド部分を取り除いた内容を 載せていただけますか?

Shauetsu
質問者

補足

Q_k(n,d)=Σ^[n/k]_(i=1)[(n!d!)/{d^(ik)i!(k!^i)(n-ik)!(d-i)!}ΣQ_j(n-ik,d-i){(d-i)^(n-ik)}/{d^(n-ik)}]です。 最初の[n/k]はガウス記号の[]で、一番大きい[]はΣにかかってる[]です。よろしくお願いします。

関連するQ&A

  • 次の変形の意味が分かりません

    解析力学の教科書の変形なのですが,和のあたりが分からないです。 特にx_kとx_iで偏微分するあたりです。解説していただけると助かります。 [Tex形式] \frac{d}{{dt}}\left( {\frac{{\partial {q_j}}}{{\partial {x_i}}}} \right) = \frac{{{\partial ^2}{q_j}}}{{\partial t\partial {x_i}}} + \sum\limits_{k = 1}^{3N} {\frac{{{\partial ^2}{q_j}}}{{\partial {x_k}\partial {x_i}}}{{\dot x}_k} = \frac{\partial }{{\partial {x_i}}}\left( {\frac{{\partial {q_j}}}{{\partial t}} + \sum\limits_{k = 1}^{3N} {\frac{{\partial {q_j}}}{{\partial {x_k}}}{{\dot x}_k}} } \right)} = \frac{{\partial {{\dot q}_j}}}{{\partial {x_i}}} (画像も添付します。)

  • texでテストを作っています。

    texでテストを作っています。 \begin{multicols}{2} (3)$ 1 - \left( + \displaystyle \frac{2}{3} \right) + \left( - \displaystyle \frac{1}{5} \right)$ \\ (4)$ \ -3 + (-6) \times 2$ \end{multicols} と、打ち込んだところ、エラーではないのですが添付画像のように、問題番号の(3)と(4)の高さがそろえられません。 どうすれば番号をそろえられますか?どなたか教えてください。

  • winshellの数式

    winshellで数式を表現したいのですが、 \begin{eqnarray} \alpha = \pm \left(\frac{1}{2}+\frac{d_{2}}{2^2}+\frac{d_{3}}{2^3}+ \odots + \frac{d_{N}}{2^N}\right) \end{eqnarray} このように打つとエラーで、Undefined Control Sequenceと出てきます どこかのコマンドに間違いはあるのでしょうか?

  • 次の計算をお教えください。

    p,q=1-pともに定数の時 \sum_{k=0}^n(k+1)p^{2}(1-p)^2 上の式が下の式にどうすればなるのかわかりません。 =p\left[\tfrac{1-q^{n+1}}{p}-(n+1)q^{n+1} \right] よろしくお願いします。

  • 掃出法で連立一次方程式の解を求める

    掃出法で連立一次方程式の解を求めるプログラムを作ってみたのですが、ポインタと浮動小数点のエラーが出てしまい、実行できません。どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。宜しくお願い致します。 #include<stdio.h> #include<math.h> #include <float.h> #define N 3 #define EPSILON 1.0E-5 #define TRUE 1 #define FALSE 0 void sweep(int *flag); void swap(float *wk1,float *wk2); float a[N][N]={{ 2, 6, 3}, {-1, 5,-2}, {-2,-1, 6}}; float x[N],b[N]={6,3,14}; int flag; void main() { int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%10.4f",a[i][j]); printf("%10.4f\n",b[i]); } flag=TRUE; sweep(&flag); if(flag==TRUE) { printf("連立方程式の解\n"); for(i=0;i=N;i++) printf("x[%d]=%10.4f\n",i+1,x[i]); } else printf("解なし\n"); } void swap(float *wk1,float *wk2) { float w; w=*wk1; *wk1=*wk2; *wk2=w; } void sweep(int *flag) { int i,j,k,ik; float ak,aik; for(k=0;k<N;k++) { ak=a[k][k]; if(fabs(ak)<=EPSILON) { ik=k+1; while((ik<N)&&(fabs(a[ik][k])<EPSILON)) ik++; if(ik<N) { for(j=k;j<N;j++) swap(&a[k][j],&a[ik][j]); swap(b[k],b[ik]); ak=a[k][k]; } else { printf("ピボットが零です\n"); *flag=FALSE; goto end; } } for(j=k;j<N;j++) a[k][j]=a[k][j]/ak; b[k]=b[k]/ak; for(i=0;i<N;i++) { if(i!=k) { aik=a[i][k]; for(j=k;j<N;j++) a[k][j]=a[i][j]-aik*a[k][j]; b[i]=b[i]-aik*b[k]; } } for(k=0;k<N;k++) x[k]=b[k]; end:; } }

  • エラーは出ませんが、実行結果ができません。

    このプログラムなんですが、エラーは出ませんが結果が 0群の項目1の正解率は0.000000です 1群の項目1の正解率は0.000000です 2群の項目1の正解率は0.000000です… この様になり、正解率がでません… 初心者で、わからないので困っています。 お願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 //#define M 50//サブコンテンツの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void gunwake(int y[],int start,int N,int gunnum); void passege(int y[],int div[],int N,int num[],int u[][J],int n); static int y[I]; int div[K-1]; int divyouso=0; void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; static int num[I]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_1.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); gunwake(y,0,N,K); passege(y,div,N,num,u,n); fclose(fp); } void sum(int u[][J],int N,int n) { //static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } } void gunwake(int y[],int start,int N,int gunnum){ int tmp; int i,up,down,real; if(gunnum>1){ tmp=N/gunnum+start; //printf("tmp:%d\n",tmp); for(i=tmp;y[tmp]==y[i];i--){ } down = i + 1; //printf("down:%d\n",down); for(i=tmp;y[tmp]==y[i];i++){ } up =i; //printf("up:%d/n",up); if(tmp-down > up-tmp) real=up; else real=down; div[divyouso]=real; divyouso++; printf("%d\n",real); gunwake(y,real,N-real,gunnum-1); } } void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; int pp[I][J]; div2[0]=0; div2[K]=n; for(i=0;i<K-1;i++){ div2[i+1]=div[i]; } for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; for(i=div2[k];i<div2[k+1];i++){ pp[k][j]=pp[k][j]+u[num[i]][j]; } } } //確認 putchar('\n'); for(j=1;j<=n;j++){ for(k=0;k<K;k++){ printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); } } }

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • カウンタ利用の再帰式

    下記に記述してあるプログラムを1~100までの2の倍数の和と積を求め、但し倍数の個数Nは、N=3に変えたいのですがどうすればいいのかわかりません。 どなたかご教授お願いします。 /* prog.c */ #include <stdio.h> #define N 5 main() { static int a[N]={1,2,3,4,5}; int S[N],P[N]; int i; a[0]=i; S[0]=a[0]; P[0]=a[0]; for(i=1;i<=(N-1);i++){ a[i]=i+1; S[i]=S[i-1]+a[i]; P[i]=P[i-1]*a[i]; } for(i=0;i<=(N-1);i++){ printf("i=%d,a[%d]=%d,S[%d]=%d,P[%d]=%d\n",i,i,a[i],i,S[i],i,P[i]); } }

  • 再帰の問題です。

    AOJの問題で、C言語で書いています。 ある解答者様のコードが自分の理解に深まると思い、見ているのですが、解答者様の作った関数のところの動作がよくわかりません。 問題です。 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0030&lang=jp 解答例です。分かるところ、分からないところを書いていきます。 #include<stdio.h> int n,s,a;//グローバル変数。 void dfs(int i,int sum,int m){//ここでいう、i,sum,mが何を指しているのか分かりません。 if(m==0 && sum==s){a++;return;} if(i==10 || m==0)return; dfs(i+1,sum+i,m-1);/*再帰をしています。しかし、どうしてここに自分と同じ関数を2つ、入れている   のか、分かりません。あと、どうしてiを足したり、1引いた数を代入しているのでしょうか?*/ */ dfs(i+1,sum,m);   } int main(){ while(scanf("%d%d",&n,&s)!=EOF){//Ctrl+zを押さない限り、無限ループします。 if(n==0 && s==0)break;//問題文通り、2つとも0だったらループを表すwhileから抜けます。 a=0; dfs(0,0,n);//ここもわからないです。ただ、関数dfsの動きが分かれば、分かると思います。 printf("%d\n",a); } return 0; } 再帰は今苦戦していますので、ここでもっと理解を深め、自作関数で使えるようになりたいです。 長文失礼しました。 よろしくお願いします。

  • Latexの数式について

    次の式をLatexでPDFに変換すると、 シグマの表示が脇に表示され、おかしくなってしまうのですが、 改善する方法があればご教授ください。 よろしくお願いします。 \begin{eqnarray} a = \frac{\frac{1}{n-1} \sum^n_{i=1} (X_{i}-\bar{X})(Y_{i}-\bar{Y})}{{\sqrt{\frac{1}{n-1} \sum^n_{i=1} (X_{i}-\bar{X})^2}\sqrt{\frac{1}{n-1} \sum^n_{i=1} (Y_{i}-\bar{Y})^2}}} \end{eqnarray}