Excel VBA質問箱 IV

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

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


58090 / 76738 ←次へ | 前へ→

【23380】Re:VBAで
発言  ichinose  - 05/3/20(日) 11:00 -

引用なし
パスワード
   ▼nekokai さん、G-Luckさん、おはようございます。
>
連立合同式の一般解は、
>x≡a(mod m)
>x≡b(mod n)
>の場合、mとnの最小公倍数+k という形になり、この「k」を解として表示させます。
>よって(n*k+b-a)がmで割って「1」余る「k」が得られるまで
私は、↑この文だけ見てアプローチしました。
つまり、0〜最小公倍数-1の数値の間で
mで割ってあまりがaかつ、nで割ってあまりがbになる値を求める方法です。

'===============================================================
Sub test()
  Dim a As Variant
  Dim b As Variant
  Dim m As Variant
  Dim n As Variant
  Dim k As Variant
  Dim gcd As Variant
  a = Array(1, 2, 3, 0)
  b = Array(7, 11, 13, 200)
  m = Array(4, 9, 13, 29)
  n = Array(11, 19, 33, 600)
' ↑4例をサンプルにしました
  For idx = LBound(a) To UBound(a)
   k = get_k(a(idx), b(idx), m(idx), n(idx), gcd)
   If VarType(k) <> vbBoolean Then
    MsgBox "x≡" & a(idx) & "(mod " & m(idx) & ")" & vbLf & _
        "x≡" & b(idx) & "(mod " & n(idx) & ")" & vbLf & _
        vbLf & "x≡" & k & "(mod " & gcd & ")"
   Else
    MsgBox "x≡" & a(idx) & "(mod " & m(idx) & ")" & vbLf & _
        "x≡" & b(idx) & "(mod " & n(idx) & ")" & vbLf & _
        vbLf & "error"
    End If
   Next idx
End Sub
'=======================================================================
Function get_k(a As Variant, b As Variant, m As Variant, n As Variant, gcd As Variant)
  gcd = m * n / get_GCD(m, n)
  '↑m,nの最小公倍数
  ans = False
  k = 0
  Do While k < gcd
   If (k Mod m) = a And (k Mod n) = b Then
    ans = True
    Exit Do
    End If
   k = k + 1
   Loop
  If ans = True Then
   get_k = k
  Else
   get_k = 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

試してみてください

0 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 お礼

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