Mathematician.zip
筆記法による数値表現サンプルソース
電卓サンプルイメージ
複素数電卓サンプルイメージ
Mathemtician.exe
インストール、実行方法:zipを解凍し
\\bin\\x86\\RealeaseフォルダでMathemtician.exe or Complex.exeを実行
アンインストール方法:レジストリ等はいじってないので
解凍したフォルダを削除
筆記法による電卓です
大きな数のときとかに使います
演算子のラジオボタンで演算子の計算を行います
数値表現は
iii.ddd#eee(nnn)でiiiが整数部、dddが小数部、eeeが指数部、nnnが基数です
Cardinal、基数は2~36に対応しています
fpは小数部の桁数です
また、fpがすなわち計算の有効桁数となります
Maclaurinはマクローリン計算の精度です
Copy1で上のテキストボックスに
Copy2で下のテキストボックスに
コピーします
Memは結果をその場所に記憶します
Tableで関数テーブルを3つ親のフォルダにファイル出力します
Tableでは上のテキストボックスが増加分の数値、角度で
下のテキストボックスが繰り返し回数です
実数=0でデフォルトが入ります
素数テーブルは上のテキストボックスがその数までの素数列挙で
下のテキストボックスがその数の次の最初の奇数から列挙を開始します
基数はオマケみたいなもので、内部で10進数に変換して演算して
求める基数に変換していますので、特に小数点以下が近似値となります
Complex.exe
複素数電卓です
Phasorで、直交形式、極形式の入力切替です
TableでA^Bテーブルを3つ親のフォルダにファイル出力します
Tableでは上のテキストボックスがAの複素数で
下のテキストボックスがBの複素数です
またmem1の上のテキストボックスがBに掛ける数値で
下のテキストボックスが繰り返し回数です
複素数=0、や、実数=0でデフォルトが入ります
サンプルプロジェクトは、VisualStudio for Desktop用です
計算処理をDLL化していますので、その説明です
DLLヘッダのコピーはWritingNumber.txtにありますので、クラス構成はそれで確認してください
準備:
このDLLを使いたいプロジェクトのプロパティから参照から
WritingNumber.dllを追加します
用法:C++
名前空間を最初に追加します
using namespace WritingNumber;
マネージコードなので、ハンドルでインスタンスを保持します
WNum^ wn=gcnew WNum;//実数クラス
WCmp^ wc=gcnew WCmp;//複素数クラス
コンストラクタは
WNum::WNum(WNum% obj);
WNum::WNum(WNum^ obj);
WNum::WNum();
WNum::WNum(int n);
//n:基数,str:String数値,fp:少数点精度
//str format:["+/-"]"X..."[".Y..."]"[#["+/-"]"E..."]"
//+/-:符号,X...:整数部,.Y...:小数部,E...:指数部
WNum::WNum(int n,String^ str,int fp);
//str:String数値
//str format:["+/-"]"X..."[".Y..."]"[#["+/-"]"E..."]""(Z)"
//+/-:符号,X...:整数部,.Y...:小数部(これでm_fp決定),E...:指数部,(Z):基数
WNum::WNum(String^ str);
//str:String数値,fp:少数点精度,bbb:自動拡張fp
//str format:["+/-"]"X..."[".Y..."]"[#["+/-"]"E..."]""(Z)"
//+/-:符号,X...:整数部,.Y...:小数部,E...:指数部,(Z):基数
WNum::WNum(String^ str,int fp,bool bbb);
WCmp::WCmp(WCmp% obj);
WCmp::WCmp(WCmp^ obj);
WCmp::WCmp();
WCmp::WCmp(int n);
//rlobj:実部、絶対値,imobj:虚部、角度,b:極形式フラグ
WCmp::WCmp(WNum% rlobj,WNum% imobj);
WCmp::WCmp(WNum^ rlobj,WNum^ imobj);
WCmp::WCmp(WNum% rlobj,WNum% imobj,bool b);
WCmp::WCmp(WNum^ rlobj,WNum^ imobj,bool b);
と定義されています
-12.345、10進数、少数点精度3ならば、
WNum^ wn=gcnew WNum(10,L"-12.345",3);
あるいは
WNum^ wn=gcnew WNum(10,L"-1.2345#1",3);
もしくは
WNum^ wn=gcnew WNum(L"-12.345(10)");
さもなくば
WNum^ wn=gcnew WNum(L"-12.345(10)",3,true);//true/false:自動拡張fpOn/Off
などとします
ABC.XYZ、36進数、少数点精度3ならば、
WNum^ wn=gcnew WNum(36,L"ABC.XYZ",3);
あるいは
WNum^ wn=gcnew WNum(36,L"A.BCXYZ#2",3);
もしくは
WNum^ wn=gcnew WNum(L"ABC.XYZ(36)");
さもなくば
WNum^ wn=gcnew WNum(L"ABC.XYZ(36)",3,true);//true/false:自動拡張fpOn/Off
などとします
直交形式-12.345+789iならば、
WCmp^ wc=gcnew WCmp(gcnew WNum(10,L"-12.345",3),gcnew WNum(10,L"789",3),false);
とします
極形式(1,-2)ならば、
WCmp^ wc=gcnew WCmp(gcnew WNum(10,L"1",3),gcnew WNum(10,L"-2",3),true);
とします
そして、オペレータで演算します
戻り値retのメンバm_efがエラーフラグで、bit立て
0x0 :正常
0x1 :エラー
0x100 :虚数解
となっています
他のヘルパー関数は、WritingNumber.txtを確認してください
対数Log e X の高速化
・Xのe(底)の桁合わせをする
a=1/e;
b=-1;
if(a<x){
while(a<x){a=a*e;b=b+1;}
}
else{
a=1;
while(x<a){a=a/e;b=b+1;}
b=-b-1;
}
y=a/x;
これで、yのマクローリン展開(ans)をして
ret=b-ans;
とすれば、かなりの高速化になる
指数e^x の高速化
・Xの桁合わせをする
a=floor(x);//小数点以下切捨て関数(整数取得)
b=power(e,a);//実数の整数乗関数
y=x-a;//小数点取得
これで、yのマクローリン展開(ans)をして
ret=b*ans;
とすれば、かなりの高速化になる
Func(X)=a/b→0、になるような時、逆関数で
Func^-1(Func(X))=Xの再現率が悪い
素因数分解の高速化
・素数か否か単純判別をして、試し割りの方向を考える
素数ってエラストテネスの篩とか考えると
2×3=6でふるって
7以上の素数って6で割った余りは1、5が素数の必要条件で
2×3×5=30でふるって
31以上の素数って30で割った余りは1、7、11、13、17、19、23、29が素数の必要条件
6の場合、はじけないのは2/6、30の場合、はじけないのは8/30、210の場合、はじけないのは43/210
になるから、その素数単純判定法がめちゃくちゃ計算量が少ないんじゃないかなぁ・・・
同様に2×3×5×7=210でも2×3×5×7×11=2310でも
素数列を順番に掛け合わせれば出来るけど、コーディングのデータ入力が面倒くさいです
その場合は素数データファイルを作ってそれでやらせて、1以外の掛け合わした素数以外の素数がその必要条件
掛け合わす素数が大きくなるほど、よくはじきます
この単純判別で、素数かもしれなかったら√xから5まで試し割り
そうでなかったら5から√xまで試し割り
と思ったら、素数かもしれなくても5からやったほうが速いから
素因数分解の高速化には使えなくて、素数判定の高速化にだけに使えた
はじけない確率P、ガウスの素数確率G
G=1/ln6=0.55811
P=2/6=0.3333333
G=1/ln30=0.2940141
P=8/30=0.266666667
G=1/ln210=0.187017
P=43/210=0.2047619
テスト中
ああ、6、30、はよくて、210はうまくいかないで、2310はいい感じかも
どんな数でふるうかの法則がまだよく分からないな
6、30、しかだめかも・・・
P=8/30=0.266666667
で偶数ははじけるとしてP'=0.53333だから奇数の半分くらいをはじく感じかな・・・
2310もアウト
で、素数かもしれない判定は
if((X mod 6)==(1 or 5))
if((X mod 30)==(1 or 7 or 11 or 13 or 17 or 19 or 23 or 29))
こんな感じでできる
これでふるわれたら合成数確定
エラストテネスの篩のようなはじきかたです
戻る