//========================================================= // フラッシュ ( P5 24点 ) //========================================================= int Flush( const int hd[], int cg, int us ){ int target; // 対象とするマーク(SHDC) struct card deck[13] = {0};// 山札の構造体 double Mark[4] = {0}; // 各マークの出る確率(0=S 1=H 2=D 3=C) double hand_pro[5] = {0}; // 各手札のマークの出る確率(1枚目,2枚目,...) double min = 1; // 最小値を格納 int chng_mark = 0; // 捨てるマーク int sut_max = 0; // 手持ちカードの最大組のマークを示す int ret=0; // 交換するカード int i, j; // 反復変数 int a, b; // 一時変数 if( poker_point(hd) >= P5 ){ return -1; } for( i=0; i< 4; i++ ){ deck[i].mark = 13-(sut[i] + udsut[i]); } // (手札と捨て札から)山札のマーク残り数を求める for( i=0; i<HNUM; i++ ){ if( CHNG-cg < HNUM-sut[i] || deck[hand[i].mark].mark == 0 ){ // 残りチェンジ数が必要枚数よりも多い場合 か 山札に対象マークカードがない hand_pro[i] = 0; }else{ a = Combi( deck[hand[i].mark].mark, HNUM - sut[hand[i].mark] ); // 13C4 など 13枚のうち、5枚に足りない4枚が出る確率を求める b = Combi( (52-us-HNUM), HNUM - sut[hand[i].mark] ); // 山札の中から 5枚に足りない4枚が出る確率を求める hand_pro[i] = (double)a/b; } } for( i=0; i<4; i++ ){ // 手札の中からマークの数が最大の物を探す if( sut_max < sut[i] ){ sut_max = sut[i]; target = i; } } if( sut[target] == 2 || sut[target] == 3 || sut[target] == 4 ){ // 既に出来ているペアは(確率を最大にして)崩さない for( j=0; j<HNUM; j++ ){ if( hand[j].mark == target ){ hand_pro[j] = 1.0; } } } for( i=0; i<HNUM; i++ ){ // 出る確率の低いマークを探す if( hand_pro[i] < min ){ min = hand_pro[i]; chng_mark = i; } } ret = chng_mark; return ret; }
/*Calleuro_n*/ static double Call_euro_n(double S, double K, double T, double r, double divid, double sigma,int n) { double d=ap_carr_D(divid,T,n); double epsilon=ap_carr_epsilon(r,divid,sigma,T,n); double gamma_carr=ap_carr_gamma(r,divid,sigma); double R1=ap_carr_R(r,T,n); double q1=ap_carr_q(r,divid,sigma,T,n); double p1=ap_carr_p(r,divid,sigma,T,n); double q_1=ap_carr_qhat(r,divid,sigma,T,n); double p_1=ap_carr_phat(r,divid,sigma,T,n); double S1,S2; int k,l; if (S>K) { return S*pow_int(d,n)-K*pow_int(R1,n)+Put_euro_n(S,K,T,r,divid,sigma,n); } else { S1=0; for (k=0;k<=n-1;k++) { S2=0; for(l=0;l<=n-k-1;l++) { S2+=Combi(n-1+l,n-1)*(K*pow_int(d,n)*pow_int(q_1,k+l)*pow_int(p_1,n)-K*pow_int(R1,n)*pow_int(q1,k+l)*pow_int(p1,n)); } S1+=(pow_int(2*epsilon*log(K/S),k)/Factor(k))*S2; } return pow(S/K,gamma_carr+epsilon)*S1; } }
/*b*/ static double ap_carr_b(int i,int n,double S,double K,double T,double r,double divid,double sigma,double s[10]) { int j,k,l; double S1,S2,S3; double d=ap_carr_D(divid,T,n); double epsilon=ap_carr_epsilon(r,divid,sigma,T,n); double gamma_carr=ap_carr_gamma(r,divid,sigma); double delta=ap_carr_delta(T,n); double R1=ap_carr_R(r,T,n); double q1=ap_carr_q(r,divid,sigma,T,n); double p1=ap_carr_p(r,divid,sigma,T,n); double q_1=ap_carr_qhat(r,divid,sigma,T,n); double p_1=ap_carr_phat(r,divid,sigma,T,n); S1=0.; for(j=1;j<=n-i+1;j++) { S2=0.; for(k=0;k<=j-1;k++) { S3=0.; for(l=0;l<=j-k-1;l++) { S3+=Combi(j-1+l,j-1)*(pow_int(q1*R1,j)*pow_int(p1,k+l)*K*r-pow_int(q_1*d,j)*pow_int(p_1,k+l)*s[n-j+1]*divid)*delta; } S2+=(pow_int(2*epsilon*log(S/s[n-j+1]),k)/Factor(k))*S3; } S1+=pow(S/s[n-j+1],gamma_carr-epsilon)*S2; } return S1; }
std::vector<std::vector<long>> Product( int size ) {//产生杨辉三角数据 std::vector<std::vector<long>> db; for (int i=0;i<=size;++i) { int tag=0; std::vector<long> temp(i+1,0); std::generate(temp.begin(),temp.end(),[&tag,i]() { return Combi(i,tag++); }); db.push_back(temp); } return db; }