|
▼nekokai さん
こんばんは。
プログラムのインターフェースを変えました。
最大公倍数は、LCMでしたっけ?
'=======================================================
Sub test()
Dim a As Variant
Dim b As Variant
Dim m As Variant
Dim n As Variant
Dim k As Variant
Dim lcm As Variant
' x≡1(mod7)
' x≡4(mod11)
' 場合
'
a = Array(1, 4)
m = Array(7, 11)
ReDim mesarray(UBound(m))
For idx = LBound(m) To UBound(m)
mesarray(idx) = "x≡" & a(idx) & "(mod " & m(idx) & ")"
Next idx
mes = Join(mesarray(), vbLf)
mes = mes & vbLf & vbLf
k = get_godou(a, m, lcm)
If VarType(k) <> vbBoolean Then
MsgBox mes & "x≡" & k & "(mod " & lcm & ")"
Else
MsgBox mes & "error"
End If
'
' x≡2(mod3)
' x≡3(mod5)
' x≡2(mod7)
' 場合
'
a = Array(2, 3, 2)
m = Array(3, 5, 7)
ReDim mesarray(UBound(m))
For idx = LBound(m) To UBound(m)
mesarray(idx) = "x≡" & a(idx) & "(mod " & m(idx) & ")"
Next idx
mes = Join(mesarray(), vbLf)
mes = mes & vbLf & vbLf
k = get_godou(a, m, lcm)
If VarType(k) <> vbBoolean Then
MsgBox mes & "x≡" & k & "(mod " & lcm & ")"
Else
MsgBox mes & "error"
End If
End Sub
'======================================
Function get_godou(a As Variant, m As Variant, lcm As Variant) As Variant
'合同式を解く?
'input a(配列)x≡a(mod m) のaに相当する数値の配列
' m(配列) x≡a(mod m) のmに相当する数値の配列
'output lcm--配列mの最小公倍数
' get_godou----nekokai さんおっしゃるk
' Falseの場合、解なし
lcm = m(LBound(m))
For idx = LBound(m) + 1 To UBound(m)
lcm = lcm * m(idx) / get_GCD(lcm, m(idx))
'↑最小公倍数
Next idx
k = 0
Do While k < lcm
ans = True
For idx = LBound(m) To UBound(m)
If (k Mod m(idx)) <> a(idx) Then
ans = False
Exit For
End If
Next idx
If ans = True Then Exit Do
k = k + 1
Loop
If ans = True Then
get_godou = k
Else
get_godou = False
End If
End Function
'================================
Function get_GCD(n1 As Variant, n2 As Variant) As Long
'最大公約数を求める
Dim val1 As Long
Dim val2 As Long
Dim amari As Long
val1 = n1
val2 = n2
get_GCD = 1
Do While val2 <> 0
amari = val1 Mod val2
If amari = 0 Then
get_GCD = val2
End If
val1 = val2
val2 = amari
Loop
End Function
私は、この合同式というものをnekokai さんが投稿されるまで
知りませんでしたが(だって、合同って言ったら三角形の・・・だもん)、
ちなみにこれって、大学の数学科では習うものなのですか?
これで一応、解は得られています。確認して下さい。
>sattshi_2005@mail.goo.ne.jp
上記のアドレスに添付して送付しておきます。
尚、このコードは、Excel2000で確認したものです。
|
|