2008年12月20日土曜日

[Algo]和と積から元の2数の算出

[はじめに]
(1)ある2数の和と積から、元の2数を求めるアルゴリズムです。
   例えば、『足して5』、『掛けて6』になる2つの数は、
   になります。
   これを解くアルゴリズムとして、
   2次方程式の解の解法を利用することができます。

   具体的には、
   Xについての2次方程式
   2-5X+6=0 は因数分解すると、
   (X-2)(X-3)=0 となり、
   解はX=2、3 となります。

   つまり、
   2-(α+β)X+αβ=0 の解が、
   X=α、β となることを利用することで、
   元の2数を求めることができます。

   α+β=Aαβ=Bとした時、
   2次方程式の解の公式から、
   2-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次方程式の解の公式
2次方程式の解の公式
[ソース]
''' <summary>
''' 和(α+β)と積(α×β)から、αとβを算出する。
''' </summary>
''' <param name="sum">和(α+β)</param>
''' <param name="product">積(α×β)</param>
''' <returns>αとβ(存在しない場合はNothing)</returns>
''' <remarks></remarks>
Public Shared Function CalcValueBySumProduct(ByVal sum As IntegerByVal product As IntegerAs 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 件のコメント:

コメントを投稿

[雑記]ドローン(DJI Mini 3)

(1)雑記 もともと多趣味の友人 masakazu Drone 氏が、 最近、 ドローン にハマり始めて、 更に、新たな趣味が増えたとのこと。 ドローン を始めてから、 まだ1年も経っていないとのことですが、 旅行先で山や川の景色を 空撮 して、 Youtube ...