2009-08-04 7 views
1

先日、コードベースにFractionクラスを追加していました(最初は必要ありませんでした。 。 2つの分数の間に加算を書くとき、私は小さな最適化を見いだしましたが、なぜそれがそうであるのか(数学的意味で)意味をなさない。2つの端数を加算すると、なぜマイナーな最適化が行われるのですか

説明するために、分母AとBを使用します。分母AとBはそれぞれ分母Aと分母Bと分母Aと分母Bから成り立ちます。

GCD/LCMに使用する2つの関数は次のとおりです。式はWikipediaにもあります。彼らは理解するのに十分単純です。もちろん、LCMももちろん(A * B)/ Cでもかまいません。 、

least_common_mul = least_common_multiple(Ad, Bd) 
new_nominator = An * (least_common_mul/Ad) + Bn * (least_common_mul/Bd) 
new_denominator = least_common_mul 

出来上がり行われ、明白な、作品:

static unsigned int GreatestCommonDivisor(unsigned int A, unsigned int B) 
{ 
    return (!B) ? A : GreatestCommonDivisor(B, A % B); 
} 

static unsigned int LeastCommonMultiple(unsigned int A, unsigned int B) 
{ 
    const unsigned int gcDivisor = GreatestCommonDivisor(A, B); 
    return (A/gcDivisor) * B; 
} 

まず第一のアプローチの周りに行くことができます。 LCD機能に起こるように、それはまったく同じだとして

greatest_common_div = greatest_common_divisor(Ad, Bd) 
den_quot_a = Ad/greatest_common_div 
den_quot_b = Bd/greatest_common_div 
new_numerator = An * den_quot_b + Bn * den_quot_a 
new_denominator = den_quot_a * Bd 

今すぐ新しい分母は、かなり明白です:

はその後、私のメモ帳にいくつかの落書きを通じて私が働く別のものに出くわしました。他のものは、元の分母を乗算する権利要因を特定するこの行に、交換されていることを除いて、あまりにも意味をなすように見える:

new_numerator = An * den_quot_b + Bn * den_quot_a 

ものではないA + B Bであるのはなぜ?

入力例:5/12 & 11/18

greatest_common_div = 6 
den_quot_a = 12/6 = 2; 
den_quot_b = 18/6 = 3; 
new_numerator = 5*3 + 11*2 = 37; 
new_denominator = 36; 
+3

ここで質問を見るのは難しいです。 –

+0

実際の質問ではありません – dfa

+0

@Neil:もっと見る。 –

答えて

6

それはそれはあなたが通常の画分は、同じ分母を超えることにするんだろう何だ、かなり簡単だ - の要因により、各画分の分子と分母を乗算もう一方の分数はその分母に最初の分数には存在しないということです。

2は、18から欠けている36の係数です。図3は、このように12から欠落している36の要因である、あなたは乗算:

(5/12) * (3/3) ==> 15/36 
(11/18) * (2/2) ==> 22/36 
+0

これは私が探していた答えです - ありがとう。 – nielsj

0

はおそらく、あなたは、任意の2つの正の数mn

ために...数論のアイデンティティの一つが欠けています
m*n = gcd(m,n) * lcm(m,n) 

例:/ BおよびC/D画分に共通分母を見つける

4*18 = 2 * 36 
15*9 = 3 * 45 

は(D、B)(B、D)又は同等に、BD/GCD LCMを使用することを含みます。

関連する問題