【ニュートン反復法&ユークリッドアルゴリズム】
2039 ワード
文書ディレクトリニュートン反復法の開平方根 ニュートン反復法の簡単な紹介 ユークリッドの最大公約数 ニュートン反復法の開平方根
leetcodeには平方根を解くアルゴリズムの問題があるので、ニュートン反復法で解きたいと思っています.
ニュートン反復法の簡単な紹介
rをf(x)=0のルートとし、現在x 0をrの初期近似値として選択し、過点(x 0,f(x 0))を曲線y=f(x)の接線L,L:y=f(x 0 f’(x 0)(x-x 0))とすると、LとX軸の交点の横座標X 1=x 0-f(x 0/f’(x 0))となり、x 1をrの一次近似値と呼ぶ.過点(x 1,f(x 1))は曲線y=f(x)の接線とし、この接線とx軸の交点の横座標x 2=x 1-f(x 1/f’(x 1))を求め、x 2をrの二次近似値と呼ぶ.以上の手順を繰り返して、rの近似値シーケンスを得、xn+1=xn−f(xn/f’(xn))をrのn+1次近似値と呼び、これがニュートン反復式である.
アルゴリズムの問題を見てみましょうSince the return type is an integer, the decimal digits are truncated and only integer part ofthe result is returned Example 1: Input: 4 Output: 2 Example 2: Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842…, and since the decimal part is truncated, 2 is returned.
ニュートン反復法に基づいて,まずこの問題の反復式を求め,aの平方根xを求めると,f(x)=x 2−aがこの問題を導出したニュートン反復式は,xn+1=1/2(xn+a/xn)が反復を必要とするたびに得られる式であり,アルゴリズムを書くことができる.
ユークリッドの最大公約数
ユークリッドアルゴリズムは転がり相除法とも呼ばれ、2つの数の最大公約数を求めるために使用される.定理:2つの整数の最大公約数はその中の小さいその数と2つの数を除いた残りの数の最大公約数に等しい.最大公約数(Greatest Common Divisor)はGCDと略され、gcd(a,b)=gcd(b,a mod b)(a>bかつr=a mod bとしてもよいが、rは0ではない)は、aがa=kb+rとして表すことができる定理を証明する過程である.(a,b,k,rはいずれも正の整数であり、rはdがa,bの1つの公約数であると仮定し、d|a,d|bと表記する.すなわち、aとbはいずれもdで除算できる.一方、r=a-kbは、両側が同時にdで除算され、r/d=a/d-kb/d=mであり、等式右側からmは整数であることが分かるため、d|rはしたがってdであり、a mod bの公約数はdがbであり、a mod bの公約数はdがbであると仮定し、d|b,d|(a-k*b)、kは整数である.さらにd|a.したがってdもaであり、bの公約数は(a,b)と(b,a mod b)の公約数が同じであり、その最大公約数も必然的に等しく、証明される.したがって、最大公約数を求めるコードは、
leetcodeには平方根を解くアルゴリズムの問題があるので、ニュートン反復法で解きたいと思っています.
ニュートン反復法の簡単な紹介
rをf(x)=0のルートとし、現在x 0をrの初期近似値として選択し、過点(x 0,f(x 0))を曲線y=f(x)の接線L,L:y=f(x 0 f’(x 0)(x-x 0))とすると、LとX軸の交点の横座標X 1=x 0-f(x 0/f’(x 0))となり、x 1をrの一次近似値と呼ぶ.過点(x 1,f(x 1))は曲線y=f(x)の接線とし、この接線とx軸の交点の横座標x 2=x 1-f(x 1/f’(x 1))を求め、x 2をrの二次近似値と呼ぶ.以上の手順を繰り返して、rの近似値シーケンスを得、xn+1=xn−f(xn/f’(xn))をrのn+1次近似値と呼び、これがニュートン反復式である.
アルゴリズムの問題を見てみましょうSince the return type is an integer, the decimal digits are truncated and only integer part ofthe result is returned Example 1: Input: 4 Output: 2 Example 2: Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842…, and since the decimal part is truncated, 2 is returned.
ニュートン反復法に基づいて,まずこの問題の反復式を求め,aの平方根xを求めると,f(x)=x 2−aがこの問題を導出したニュートン反復式は,xn+1=1/2(xn+a/xn)が反復を必要とするたびに得られる式であり,アルゴリズムを書くことができる.
int mySqrt(int x)
{
if (x < 0)
{
return -1;
}
double e = 1e-15;
double xn = x;
double xn1 = (xn + x / xn) / 2;
while (abs(xn - xn1) > e)
{
xn = xn1;
xn1 = (xn + x / xn) / 2;
}
return (int)xn;
}
ユークリッドの最大公約数
ユークリッドアルゴリズムは転がり相除法とも呼ばれ、2つの数の最大公約数を求めるために使用される.定理:2つの整数の最大公約数はその中の小さいその数と2つの数を除いた残りの数の最大公約数に等しい.最大公約数(Greatest Common Divisor)はGCDと略され、gcd(a,b)=gcd(b,a mod b)(a>bかつr=a mod bとしてもよいが、rは0ではない)は、aがa=kb+rとして表すことができる定理を証明する過程である.(a,b,k,rはいずれも正の整数であり、rはdがa,bの1つの公約数であると仮定し、d|a,d|bと表記する.すなわち、aとbはいずれもdで除算できる.一方、r=a-kbは、両側が同時にdで除算され、r/d=a/d-kb/d=mであり、等式右側からmは整数であることが分かるため、d|rはしたがってdであり、a mod bの公約数はdがbであり、a mod bの公約数はdがbであると仮定し、d|b,d|(a-k*b)、kは整数である.さらにd|a.したがってdもaであり、bの公約数は(a,b)と(b,a mod b)の公約数が同じであり、その最大公約数も必然的に等しく、証明される.したがって、最大公約数を求めるコードは、
int GCD(int a, int b)
{
if (a < b)
{
std::swap(a, b);
}
if (b == 0)
{
return a;
}
int iterValue = 0;
while(b > 0)
{
iterValue = a % b;
a = b
b = iterValue;
}
return a;
}