[はじめに]
(1)
ある2数の和と積から、元の2数を求めるアルゴリズムです。
例えば、『
足して5』、『
掛けて6』になる2つの数は、
2と
3になります。
これを解くアルゴリズムとして、
2次方程式の解の解法を利用することができます。
具体的には、
Xについての2次方程式
X2-5X+6=0 は因数分解すると、
(X-2)(X-3)=0 となり、
解は
X=2、3 となります。
つまり、
X2-(α+β)X+αβ=0 の解が、
X=α、β となることを利用することで、
元の2数を求めることができます。
α+β=A、
αβ=Bとした時、
2次方程式の解の公式から、
X2-AX+B=0
X= {A±(A2 - 4B)1/2} / 2 となり、
求める2数は、
X= {A+(A2 - 4B)1/2} / 2 と
X= {A-(A2 - 4B)1/2} / 2
となります。
また、2次方程式の判別式が負数の場合、
つまり2次方程式の実数解が存在しない場合は、
元の2数が存在しないので、解を算出する前にチェックする必要があります。
[参考]2次方程式の解の公式
[ソース]
|
''' <summary>
''' 和(α+β)と積(α×β)から、αとβを算出する。
''' </summary>
''' <param name="sum">和(α+β)</param>
''' <param name="product">積(α×β)</param>
''' <returns>αとβ(存在しない場合はNothing)</returns>
''' <remarks></remarks>
Public Shared Function CalcValueBySumProduct(ByVal sum As Integer, ByVal product As Integer) As Decimal()
'α、βの算出に
'2次方程式の解の公式を利用する。
' 以下の2次方程式を解くと、X=α、βになることを利用して、
' X*X - (α+β)*X + α*β = 0
' を解く。
' X= [(α+β)±√{(α+β)*(α+β) - 4*α*β}] / 2
'補足
' 実数解が存在しない場合は、解が存在しないものとする。
Dim dist As Decimal = sum * sum - 4 * product
If dist < 0 Then
Return Nothing
End If
Dim sqrtDist As Decimal = Math.Sqrt(dist)
Dim rtnValue() As Decimal = New Decimal(1) {}
rtnValue(0) = (sum - sqrtDist) / 2
rtnValue(1) = (sum + sqrtDist) / 2
Return rtnValue
End Function | |
[VB.NET]和と積から元の2数を算出する。 |
0 件のコメント:
コメントを投稿