#Include "gmpf-overloadJP.bi" 'by srvaldez ≫ Dec 16, 2016 4:06 'https://www.freebasic.net/forum/viewtopic.php?f=3&t=23225&start=15 '円周率 Function pi( ByVal prec As Long) As gmpf set_precision(prec) Dim As gmpf a,b,t,p,aa,bb,tt,pp 'ユーザ定義型で、各変数を設定します a=1 b=0.5 t=0.25 p=1 b=gmpf_sqr( b ) For i As Integer = 1 To Int(Log(prec)*1.44269504088896) aa = (a+b)/2 bb = gmpf_sqr(a*b) tt = t-p*(a-aa)^2 pp = 2*p Swap a, aa Swap b, bb Swap t, tt Swap p, pp Next Return (a+b)^2/4/t End Function set_precision(20) '精度を少なくとも20桁に設定 Dim As Integer i Dim As gmpf y,x="0.333333333333333333333333333" '文字列を使って浮動小数を代入 Print "乗算" If 3*x<1 Then Print "3*x は 1 未満" End If Print ' for loop で mpf を使う Print "平方根" For x=1 To 10 y=gmpf_sqr(x) Print "gmpf_sqr";x;" = ";y Next Print Print "mpf 数を表示する別の方法" Print "平方根(ルート10)" Print y.toString("%15.10f") 'mpf 数を表示する別の方法 <全体の幅 15>.<小数点以下の幅 10> 実数を出力 Print Print "円周率" Print pi(1000) Print "何かキー入力で終了"; Sleep
#Include "gmpf-overloadJP.bi" # include "vbcompat.bi" ' 素因数分解 Declare Sub STRreplace(ByRef Expression As String, ByRef Find As String, ByRef Replacement As String, ByVal Start As Integer = 1) Dim Suuchi As String Dim N As gmpf Dim STARTT As Long Dim ENDTIME As Long Dim Minut As Integer Dim A As gmpf Dim HANTEI As String Dim Hairetsu() As gmpf Dim I As Integer Dim J As Integer Dim Kekka As gmpf Dim Counter As LongInt set_precision(25) '精度を少なくとも25桁に設定する KURIKAESHI: Cls PRINT "素因数分解します。" PRINT "任意の整数を入力して下さい。" PRINT "例えば、12,319 とか 4,294,967,297 とか入力してEnterします。" PRINT "あるいは、99,400,891 とか 6,041,375,340 とか、123,456,789,013 とか、" Print "2,305,843,008,139,952,128 とか、" PRINT "70,000,104,900,007 とか、70,000,005,000,000,007 など入力してEnterします。" Print "以下は ULongInt を超えていますが・・・" PRINT " 18,446,744,073,709,551,617 = 274,177 * 67,280,421,310,721 " Print "121,439,531,096,594,251,777 = 3,930,785,153 * 30,894,471,809 (2時間かかる)" Print I=0 Kekka=1 Counter=0 Line Input Suuchi STRreplace(Suuchi, ",", "") N = Suuchi STARTT=VAL(LEFT(Time,2))*3600+VAL(MID(Time,4,2))*60+VAL(RIGHT(Time,2)) Cls PRINT Suuchi ;"="; Gusu: A=2 Tsugi: Counter= Counter+1 IF A>SQR(N) THEN GOTO Owari IF N-INT(N/A)*A=0 THEN GOTO Tsuzuku IF A>2 THEN A=A+2 :GOTO Tsugi A=A+1 :GOTO Tsugi Tsuzuku: PRINT A; "*" ; I=I+1 ReDim Preserve Hairetsu(I) Hairetsu(I)=A N=N/A : GOTO Gusu Owari: PRINT N ENDTIME = VAL(LEFT(Time,2))*3600+VAL(MID(Time,4,2))*60+VAL(RIGHT(Time,2)) Minut=(ENDTIME-STARTT)\60 PRINT USING "処理時間は、###分 ##秒でした。"; Minut; (ENDTIME-STARTT)-Minut*60 Print Print "演算の繰返し回数:"; Format(Counter,"#,##0") Print Print "検算します。" For J=1 To I Print Hairetsu(J);"*"; Kekka=Kekka*Hairetsu(J) Next Print N;"=" Print Kekka*N Print Print "もう一度やりますか? Y (または y)なら再度。" Input "それ以外の文字を入力すると終了します。",HANTEI If HANTEI="Y" Or HANTEI="y" Then GoTo KURIKAESHI EndIf Sub STRreplace(ByRef Expression As String, ByRef Find As String, ByRef Replacement As String, ByVal Start As Integer = 1) Var p = InStr(Start, Expression, Find), li = Len(Find), ls = Len(Replacement) : If li = ls Then li = 0 While p If li Then Expression = Left(Expression, p - 1) & Replacement & Mid(Expression, p + li) Else Mid(Expression, p) = Replacement p = InStr(p + ls, Expression, Find) Wend End Sub
'by srvaldez ≫ Dec 16, 2016 4:06 'https://www.freebasic.net/forum/viewtopic.php?f=3&t=23225&start=15 #Include Once "gmp.bi" Type gmpf Declare Constructor ( ) Declare Constructor ( ByVal rhs As Long ) Declare Constructor ( ByVal rhs As LongInt ) Declare Constructor ( ByVal rhs As Integer ) Declare Constructor ( ByVal rhs As Double ) Declare Constructor ( ByVal rhs As Single ) Declare Constructor ( ByRef rhs As String ) Declare Constructor ( ByRef rhs As gmpf ) Declare Constructor ( ByRef rhs As __mpq_struct ) Declare Constructor ( ByRef rhs As __mpz_struct ) Declare Destructor ( ) Declare Operator Let ( ByRef rhs As gmpf ) Declare Operator Let ( ByRef rhs As __mpq_struct ) Declare Operator Let ( ByRef rhs As __mpz_struct ) Declare Operator Let ( ByVal rhs As Long ) Declare Operator Let ( ByVal rhs As LongInt ) Declare Operator Let ( ByVal rhs As Integer ) Declare Operator Let ( ByVal rhs As Double ) Declare Operator Let ( ByVal rhs As Single ) Declare Operator Let ( ByRef rhs As String ) Declare Operator Cast ( ) As String Declare Operator Cast ( ) As Long Declare Operator Cast ( ) As Double Declare Operator Cast ( ) As Single '---------------------------------------------- Declare Operator += (ByRef rhs As gmpf) Declare Operator += (ByVal rhs As Long) Declare Operator += (ByVal rhs As Double) Declare Operator += (ByVal rhs As Single) Declare Operator += (ByVal rhs As LongInt) Declare Operator += (ByVal rhs As Integer) Declare Operator += (ByRef rhs As String) Declare Operator -= (ByRef rhs As gmpf) Declare Operator -= (ByVal rhs As Double) Declare Operator -= (ByVal rhs As Single) Declare Operator -= (ByVal rhs As LongInt) Declare Operator -= (ByVal rhs As Integer) Declare Operator -= (ByVal rhs As Long) Declare Operator -= (ByRef rhs As String) Declare Operator *= (ByRef rhs As gmpf) Declare Operator *= (ByVal rhs As Double) Declare Operator *= (ByVal rhs As Single) Declare Operator *= (ByVal rhs As LongInt) Declare Operator *= (ByVal rhs As Integer) Declare Operator *= (ByVal rhs As Long) Declare Operator *= (ByRef rhs As String) Declare Operator /= (ByRef rhs As gmpf) Declare Operator /= (ByVal rhs As Double) Declare Operator /= (ByVal rhs As Single) Declare Operator /= (ByVal rhs As LongInt) Declare Operator /= (ByVal rhs As Integer) Declare Operator /= (ByVal rhs As Long) Declare Operator /= (ByRef rhs As String) Declare Operator ^= (ByVal rhs As ULong) Declare Operator ^= (ByRef rhs As gmpf) ' For Next Implicit step = +1 Declare Operator For ( ) Declare Operator Step( ) Declare Operator Next( ByRef end_cond As gmpf ) As Integer ' For Next Exlicit step Declare Operator For ( ByRef stp As gmpf ) Declare Operator Step( ByRef stp As gmpf ) Declare Operator Next( ByRef end_cond As gmpf, ByRef step_var As gmpf ) As Integer '---------------------------------------------- Declare Function toString( ByVal frmt As String ="") As String Declare Function toLong ( ) As Long Declare Function toDouble ( ) As Double Declare Function toSingle ( ) As Single Declare Sub Set_Prec (ByVal n As Long = -1) num As __mpf_struct End Type Sub set_precision(ByVal n As ULong=mpf_get_default_prec()*.3) mpf_set_default_prec( n*3.33 ) End Sub Function gmpf.toString( ByVal frmt As String ="") As String Dim As Long length = mpf_get_prec(@num)*0.3 Dim As String sp =" " If frmt="" Or frmt="g" Then frmt="%"+Str(length+4)+"."+Str(length-1)+"g" ElseIf frmt="f" Then frmt="%"+Str(length+4)+"."+Str(length-1)+"f" ElseIf frmt="e" Then frmt="%"+Str(length+4)+"."+Str(length-1)+"e" End If frmt = Left(frmt,Len(frmt)-1)+"F"+Right(frmt,1) If InStr(frmt , "%")=0 Then frmt = "%"+frmt length = gmp_snprintf(0, 0, frmt, @num) Dim As ZString Ptr rstring=Allocate(length+20) gmp_sprintf(rstring, frmt, @num) If mpf_sgn(@num)<0 Then sp = "" Function = sp + LTrim(*rstring) DeAllocate(rstring) End Function Sub gmpf.Set_Prec(ByVal n As Long = -1) If n=-1 Then mpf_set_prec(@num, mpf_get_default_prec()) Else mpf_set_prec(@num, n*3.33) End If End Sub Function gmpf.toLong ( ) As Long Function = mpf_get_si(@num) End Function Function gmpf.toDouble ( ) As Double Function = mpf_get_d(@num) End Function Function gmpf.toSingle ( ) As Single Dim As Double sx sx = mpf_get_d(@num) Function = sx End Function Constructor gmpf ( ) mpf_init(@num) mpf_set_si(@num, 0) End Constructor Constructor gmpf ( ByVal rhs As Long ) mpf_init(@num) mpf_set_si(@num, rhs) End Constructor Constructor gmpf ( ByRef rhs As __mpq_struct ) mpf_init(@num) mpf_set_q(@num, @rhs) End Constructor Constructor gmpf ( ByRef rhs As __mpz_struct ) mpf_init(@num) mpf_set_z(@num, @rhs) End Constructor Constructor gmpf ( ByRef rhs As String ) mpf_init(@num) mpf_set_str(@num, rhs, 10) End Constructor Constructor gmpf ( ByRef rhs As gmpf ) mpf_init(@num) mpf_set(@num, @rhs.num) End Constructor Constructor gmpf ( ByVal rhs As LongInt ) Dim As String s=Str(rhs) mpf_init(@num) mpf_set_str(@num, s, 10) End Constructor Constructor gmpf ( ByVal rhs As Integer ) Dim As String s=Str(rhs) mpf_init(@num) mpf_set_str(@num, s, 10) End Constructor Constructor gmpf ( ByVal rhs As Double ) mpf_init(@num) mpf_set_d(@num, rhs) End Constructor Constructor gmpf ( ByVal rhs As Single ) Dim As Double sx = rhs mpf_init(@num) mpf_set_d(@num, sx) End Constructor Destructor gmpf ( ) mpf_clear(@num) End Destructor Operator gmpf.let ( ByRef rhs As gmpf ) mpf_set(@num, @rhs.num) End Operator Operator gmpf.let ( ByRef rhs As __mpq_struct ) mpf_set_q(@num, @rhs) End Operator Operator gmpf.let ( ByRef rhs As __mpz_struct ) mpf_set_z(@num, @rhs) End Operator Operator gmpf.let ( ByVal rhs As Long ) mpf_set_si(@num, rhs) End Operator Operator gmpf.let ( ByRef rhs As String ) mpf_set_str(@num, rhs, 10) End Operator Operator gmpf.Let ( ByVal rhs As LongInt ) Dim As String s=Str(rhs) mpf_set_str(@num, s, 10) End Operator Operator gmpf.Let ( ByVal rhs As Integer ) Dim As String s=Str(rhs) mpf_set_str(@num, s, 10) End Operator Operator gmpf.Let ( ByVal rhs As Double ) mpf_set_d(@num, rhs) End Operator Operator gmpf.Let ( ByVal rhs As Single ) Dim As Double sx = rhs mpf_set_d(@num, sx) End Operator Operator gmpf.cast ( ) As String Dim As Long length = mpf_get_prec(@num)*0.3 Dim As String sp =" ", s = "%"+Str(length+4)+"."+Str(length-1)+"Fg" length = gmp_snprintf(0, 0, s, @num) Dim As ZString Ptr rstring=Allocate(length+20) gmp_sprintf(rstring, s, @num) If mpf_sgn(@num)<0 Then sp = "" Operator = sp + LTrim(*rstring) DeAllocate(rstring) End Operator Operator gmpf.cast ( ) As Long Operator = mpf_get_si(@num) End Operator Operator gmpf.cast ( ) As Double Operator = mpf_get_d(@num) End Operator Operator gmpf.cast ( ) As Single Operator = mpf_get_d(@num) End Operator '============================================================================ '' For Next for gmpf type '' '' 暗黙的ステップ版 '' '' この例では、暗黙的ステップを1と解釈します '' Operator gmpf.for ( ) End Operator Operator gmpf.step ( ) This += 1 'this = this+1 ' End Operator Operator gmpf.next ( ByRef end_cond As gmpf ) As Integer Return This <= end_cond End Operator '' 明示的ステップ版 '' Operator gmpf.for ( ByRef step_var As gmpf ) End Operator Operator gmpf.step ( ByRef step_var As gmpf ) This += step_var 'this = this + step_var ' End Operator Operator gmpf.next ( ByRef end_cond As gmpf, ByRef step_var As gmpf ) As Integer If step_var < 0 Then Return This >= end_cond Else Return This <= end_cond End If End Operator '============================================================================ Operator + ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_add(@result.num, @lhs.num, @rhs.num) Operator = result End Operator Operator + ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf Dim As gmpf result mpf_add_ui(@result.num, @lhs.num, rhs) Operator = result End Operator Operator - ( ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_neg(@result.num, @rhs.num) Operator = result End Operator Operator - ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_sub(@result.num, @lhs.num, @rhs.num) Operator = result End Operator Operator - ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf Dim As gmpf result mpf_sub_ui(@result.num, @lhs.num, rhs) Operator = result End Operator Operator - ( ByVal lhs As culong, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_ui_sub(@result.num, lhs, @rhs.num) Operator = result End Operator Operator * ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_mul(@result.num, @lhs.num, @rhs.num) Operator = result End Operator Operator * ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf Dim As gmpf result mpf_mul_ui(@result.num, @lhs.num, rhs) Operator = result End Operator Operator / ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_div(@result.num, @lhs.num, @rhs.num) Operator = result End Operator Operator / ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf Dim As gmpf result mpf_div_ui(@result.num, @lhs.num, rhs) Operator = result End Operator Operator / ( ByVal lhs As culong, ByRef rhs As gmpf ) As gmpf Dim As gmpf result mpf_ui_div(@result.num, lhs, @rhs.num) Operator = result End Operator Operator ^ ( ByRef lhs As gmpf, ByVal rhs As ULong ) As gmpf Dim As gmpf result mpf_pow_ui(@result.num, @lhs.num, rhs) Operator = result End Operator Operator gmpf.+= (ByRef rhs As gmpf) mpf_add(@this.num, @this.num, @rhs.num) End Operator Operator gmpf.+= (ByVal rhs As Long) Dim As gmpf x mpf_set_si(@x.num, rhs) mpf_add(@this.num, @this.num, @x.num) End Operator Operator gmpf.+= (ByVal rhs As Double) Dim As gmpf x mpf_set_d(@x.num, rhs) mpf_add(@this.num, @this.num, @x.num) End Operator Operator gmpf.+= (ByVal rhs As Single) Dim As gmpf x Dim As Double dx = rhs mpf_set_d(@x.num, dx) mpf_add(@this.num, @this.num, @x.num) End Operator Operator gmpf.+= (ByVal rhs As LongInt) Dim As gmpf tmp tmp=Str(rhs) mpf_add(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.+= (ByVal rhs As Integer) Dim As gmpf tmp tmp=Str(rhs) mpf_add(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.+= (ByRef rhs As String) Dim As gmpf tmp tmp=rhs mpf_add(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.-= (ByRef rhs As gmpf) mpf_sub(@this.num, @this.num, @rhs.num) End Operator Operator gmpf.-= (ByVal rhs As Long) Dim As gmpf x mpf_set_si(@x.num, rhs) mpf_sub(@this.num, @this.num, @x.num) End Operator Operator gmpf.-= (ByVal rhs As Double) Dim As gmpf x mpf_set_d(@x.num, rhs) mpf_sub(@this.num, @this.num, @x.num) End Operator Operator gmpf.-= (ByVal rhs As Single) Dim As gmpf x Dim As Double dx = rhs mpf_set_d(@x.num, dx) mpf_sub(@this.num, @this.num, @x.num) End Operator Operator gmpf.-= (ByVal rhs As LongInt) Dim As gmpf tmp tmp=Str(rhs) mpf_sub(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.-= (ByVal rhs As Integer) Dim As gmpf tmp tmp=Str(rhs) mpf_sub(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.-= (ByRef rhs As String) Dim As gmpf tmp tmp=rhs mpf_sub(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.*= (ByRef rhs As gmpf) mpf_mul(@this.num, @this.num, @rhs.num) End Operator Operator gmpf.*= (ByVal rhs As Long) Dim As gmpf x mpf_set_si(@x.num, rhs) mpf_mul(@this.num, @this.num, @x.num) End Operator Operator gmpf.*= (ByVal rhs As Double) Dim As gmpf x mpf_set_d(@x.num, rhs) mpf_mul(@this.num, @this.num, @x.num) End Operator Operator gmpf.*= (ByVal rhs As Single) Dim As gmpf x Dim As Double dx = rhs mpf_set_d(@x.num, dx) mpf_mul(@this.num, @this.num, @x.num) End Operator Operator gmpf.*= (ByVal rhs As LongInt) Dim As gmpf tmp tmp=Str(rhs) mpf_mul(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.*= (ByVal rhs As Integer) Dim As gmpf tmp tmp=Str(rhs) mpf_mul(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.*= (ByRef rhs As String) Dim As gmpf tmp tmp=rhs mpf_mul(@this.num, @this.num, @tmp.num) End Operator Operator gmpf./= (ByRef rhs As gmpf) mpf_div(@this.num, @this.num, @rhs.num) End Operator Operator gmpf./= (ByVal rhs As Long) Dim As gmpf x mpf_set_si(@x.num, rhs) mpf_div(@this.num, @this.num, @x.num) End Operator Operator gmpf./= (ByVal rhs As Double) Dim As gmpf x mpf_set_d(@x.num, rhs) mpf_div(@this.num, @this.num, @x.num) End Operator Operator gmpf./= (ByVal rhs As Single) Dim As gmpf x Dim As Double dx = rhs mpf_set_d(@x.num, dx) mpf_div(@this.num, @this.num, @x.num) End Operator Operator gmpf./= (ByVal rhs As LongInt) Dim As gmpf tmp tmp=Str(rhs) mpf_div(@this.num, @this.num, @tmp.num) End Operator Operator gmpf./= (ByVal rhs As Integer) Dim As gmpf tmp tmp=Str(rhs) mpf_div(@this.num, @this.num, @tmp.num) End Operator Operator gmpf./= (ByRef rhs As String) Dim As gmpf tmp tmp=rhs mpf_div(@this.num, @this.num, @tmp.num) End Operator Operator gmpf.^= (ByVal rhs As ULong) mpf_pow_ui(@this.num, @this.num, rhs) End Operator Operator = ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) = 0) End Operator Operator < ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) < 0) End Operator Operator > ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) > 0) End Operator Operator <= ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) <= 0) End Operator Operator >= ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) >= 0) End Operator Operator <> ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer Operator = (mpf_cmp(@lhs.num, @rhs.num) <> 0) End Operator Function gmpf_Abs(ByRef rhs As gmpf) As gmpf Dim As gmpf result mpf_abs(@result.num, @rhs.num) Function = result End Function Function gmpf_ceil(ByRef x As gmpf) As gmpf Dim As gmpf result mpf_ceil(@result.num, @x.num) Function = result End Function Function gmpf_floor(ByRef x As gmpf) As gmpf Dim As gmpf result mpf_floor(@result.num, @x.num) Return result End Function Function gmpf_int(ByRef x As gmpf) As gmpf Dim As gmpf result mpf_trunc(@result.num, @x.num) Function = result End Function Function gmpf_sgn(ByRef x As gmpf) As Integer Function = mpf_sgn(@x.num) End Function '平方根 Declare Function gmpf_Sqr OverLoad ( ByRef number As gmpf ) As gmpf Function gmpf_Sqr(ByRef x As gmpf) As gmpf Dim As gmpf result mpf_sqrt(@result.num, @x.num) Return result End Function Function gmpf_Sqr(ByVal x As ULong) As gmpf Dim As gmpf result mpf_sqrt_ui(@result.num, x) Return result End Function