
#include "stdafx.h"
#include <dkutil/dkutilDefined.h>
//***********************************
//数学系
//+**********************************

#ifndef PI
#define PI 3.14159265f
#define DKINGYO_PAIPAI_DEFINED_DEFINED_OK__
#endif



namespace dkutil{//begin dkutil namespace
	namespace oldmath{//begin math namespace


//+++++++++++++
//数列 A geometric series, an arithmetic series, a random number sequence

//等差数列　A　Arithimetic　Series
//array = 配列のポインタを代入
//num = 配列の数
//a = 初項
//d = 公差

int CreateArthimeticProgression(int *array,DWORD num,int a,int d){
//http://www.asahi-net.or.jp/~jb2y-bk/NaturalSci/math/suretuA.htm
	DWORD i=0;
	for(i=0;i<num;i++){
		array[i]=a+(i/**-1*/)*d;
	}

	return array[i];
}
//等比数列　A　Geometric　Series
//array = 配列のポインタを代入
//num = 配列の数
//a = 初項
//d = 公比
//実装してから思った…テンプレートにすれば良かった(爆)
//調和数列も似たようなものだから削除。どうせ使わない。数列関連ってお遊び関数だし…
int CreateGeometricProgression(int *array,DWORD num,int a,int r){
	DWORD i=0;
	for(i=0;i<num;i++){
		array[i]=a*(int)pow(r,i);
	}

	return array[i];
}
//乱数列　A　Random　Number Series??
//どうせ誰も使わないと思うが乱数列を作成補助するやつ
//array = 配列のポインタを代入
//num = 配列の数
//min = 乱数の最小値
//max = 乱数の最大値
//rand_func_callback = ランダム変域を返す関数。
//引数の左はmin右がmax…ってかmin<=x<=maxまでを返す関数のポインタをぶち込む。
int CreateRandomNumberProgression(
		int *array,
		DWORD num,
		int min,int max,
		int (*rand_func_callback)(int min_,int max_)){

	DWORD i=0;
	for(i=0;i<num;i++){
		array[i]=(*rand_func_callback)(min,max);
	}

	return array[i];
}


DINLINE short GetAngle(int mx,int my,int sx,int sy){
	return short(atan2(-double(sy-my),double(sx-mx))/3.141592*180+360)%360;
}




//Second power of KAI ??
// カイ二乗分布のパーセント点を求める。
//χ2　=　 (Ｏy−Ｅy）２／Ｅy＋(Ｏg−Ｅg）２／Ｅg.
//χ2　=　 Σ(Ｏi−Ｅi）２／Ｅi
//危険率を１％に下げるにはカイ二乗の値が６.６３以上かを調べればよい。
/*
カイ二乗の特徴として、次のようなことがあげられます。 
〜カイ二乗値〜
期待度数と観測度数が一致すればゼロになる。
不一致が大きくなれば（つまり、ずれが大きくなれば）大きくなる。
今、カイ二乗値が5.631とでました。
期待度数と観測度数は一致しませんでした。
では、このカイ二乗値は大きいのでしょうか、それともたいしたことはないのでしょうか？
実際に見ていきましょう。
このカイ二乗値は、自由度{（横のセル数-1）×（縦のセル数-1）}
によって決められる分布に従うことが分かっています。
*/

inline double kai2(double o1,double o2,double e1,double e2){
	return pow(o1-e1, 2.0 ) / e1 + pow(o2-e2, 2.0 ) / e2;
}
inline float kai2(float o1,float o2,float e1,float e2){
	return static_cast<float>(pow(o1-e1, 2.0 ) / e1 + pow(o2-e2, 2.0 ) / e2);
}


//# カイ二乗分布のパーセント点を求める。

#ifdef _MSC_VER
ULONGLONG __fastcall GetRDTSC(){
	_asm{
		rdtsc
	}
}
#else
ULONGLONG GetRDTSC(){
	return ::clock();
}
#endif

}//end of math namespace
}//end of dkutil namespace

#ifdef DKINGYO_PAIPAI_DEFINED_DEFINED_OK__
#undef PI
#endif

