Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


58043 / 76732 ←次へ | 前へ→

【23423】Re:VBAで
発言  ichinose  - 05/3/22(火) 19:06 -

引用なし
パスワード
   ▼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で確認したものです。

2 hits

【23300】VBAで nekokai 05/3/18(金) 15:06 質問
【23353】Re:VBAで G-Luck 05/3/19(土) 9:28 発言
【23363】Re:VBAで nekokai 05/3/19(土) 17:52 質問
【23366】Re:VBAで G-Luck 05/3/19(土) 19:09 発言
【23367】Re:VBAで G-Luck 05/3/19(土) 19:24 回答
【23377】Re:VBAで G-Luck 05/3/20(日) 10:52 発言
【23380】Re:VBAで ichinose 05/3/20(日) 11:00 発言
【23412】Re:VBAで nekokai 05/3/22(火) 11:30 お礼
【23423】Re:VBAで ichinose 05/3/22(火) 19:06 発言
【23433】Re:VBAで nekokai 05/3/23(水) 9:59 お礼

58043 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free