1. 개요
2. 목록
2.1. 나눗셈의 세로셈법
[math(begin{array}{r} begin{array}{r}\ 120 \ \ \ \ \ \ \ \ \ \ \ end{array} !!!! begin{array}{r}3.541dot6 \ begin{array}{|}hline 425quad; end{array} \ 360qquad; \ hline 65;0quad \60;0quad \ hline 5;00quad \4;80quad \ hline200 \ 120~~ \ hline{color{red}80}0 \ 720 \ hline{color{red}80} end{array} end{array})]
초등학교 수학에서 나눗셈을 이렇게 계산했을 것이다.
위 세로식에서 안쪽의 수는 나눠질 수(피제수)를, 왼쪽에는 나눌 수(제수)를 쓰고 아래로 쭉 계산해서 내려가면서 그 몫을 맨 위에 쓰는 방식이다.[1] 아무리 해도 나누어떨어지지 않을 경우, 숫자가 반복되는 구간을 짚어서 그 끝부분에서 끊은 뒤, 그 숫자 위에 점 혹은 윗줄을 그어주면 된다.
그러나 중학교 수학으로 올라가면 저렇게 계산하는 일이 없는데, 분수(정확히는 유리수)로 퉁쳐버리기(...) 때문이다.
그러다가 다시 고등학교 수학으로 올라가 다항식의 사칙연산을 할 때 세로셈법이 등장한다. 물론 얘는 위와 같이 그냥 상수끼리 나누는 건 아니다. 그러나 그 이후로는 안 등장하나 싶다가 대학 과정에서 시계 산술이 적용되는 유한체의 나눗셈에서 세로셈법이 다시 등장한다.잊어버릴만 하면 등장하는 세로셈법
초등학교 수학에서 나눗셈을 이렇게 계산했을 것이다.
위 세로식에서 안쪽의 수는 나눠질 수(피제수)를, 왼쪽에는 나눌 수(제수)를 쓰고 아래로 쭉 계산해서 내려가면서 그 몫을 맨 위에 쓰는 방식이다.[1] 아무리 해도 나누어떨어지지 않을 경우, 숫자가 반복되는 구간을 짚어서 그 끝부분에서 끊은 뒤, 그 숫자 위에 점 혹은 윗줄을 그어주면 된다.
그러나 중학교 수학으로 올라가면 저렇게 계산하는 일이 없는데, 분수(정확히는 유리수)로 퉁쳐버리기(...) 때문이다.
그러다가 다시 고등학교 수학으로 올라가 다항식의 사칙연산을 할 때 세로셈법이 등장한다. 물론 얘는 위와 같이 그냥 상수끼리 나누는 건 아니다. 그러나 그 이후로는 안 등장하나 싶다가 대학 과정에서 시계 산술이 적용되는 유한체의 나눗셈에서 세로셈법이 다시 등장한다.
2.2. 개방법
Shifting [math(n)]-th root algorithm; 開方法
각종 근호를 산술적으로 계산하는 방법으로 단순히 개법(開法)또는 개방(開方)이라고도 한다. 한자어로 제곱은 평방(平方), 세제곱은 입방(立方)이라고 하며 [math(n)]제곱을 통틀어 방(方)이라고 하기 때문에 방을 푼다(開)는 뜻에서 이런 이름이 붙었다. 특별히 제곱근, 세제곱근의 경우 각각 개평법(開平法), 개립법(開立法)이라고도 불린다.
제곱근을 시행착오법으로 구하다보면 [math(k)]개의 유효숫자를 구하는데 [math(k)]자리수끼리의 곱셈을 여러번 해야 한다. 이는 매우 귀찮은 작업일 뿐더러 손계산으로는 시간이 매우 많이 걸리기 때문에 이를 피하기 위하여 개발된 방식이다. 원리는 이항정리를 이용하는 것으로, 임의의 [math(n)]제곱근에 얼마든지 적용할 수 있다. 그러나 개평법을 제외하고는 어디까지나 컴퓨터를 이용한 알고리즘의 영역이며 [math(n=3)]만 되도 손계산 역시 매우 버거워진다.(후술) 사실상 손계산이 어느 정도 가능한 방법은 개평법이 유일하다고 해도 과언이 아니다.
2.2.1. 개평법
근본적으로 곱셈 공식
[math((a+b)^2 = a^2 + 2ab + b^2)]
|
에서 [math(a^2)]을 이항한
[math((a+b)^2 - a^2 = (2a + b)b)]
|
를 이용한다. [math(sqrt{15.2512})]를 예로, 하나씩 넣어보기가 [math((3 + b)^2 le 15.2512)]인 최대의 [math(b)]를 찾는 방법이라면, 개평법은 우선 [math(a^2 = 9)]를 양변에서 빼서
[math((2a + b)b = (3times2 + b)b le 6.2512)]
|
의 꼴로 만들고 [math(3.1)], [math(3.2)], …등은 모두 [math(3 + 0.1x)]꼴, 즉 [math(b = 0.1x)]이므로 양변에 [math(100)]을 곱해
[math(100(3times2 + 0.1x)0.1x = (3times20 + x)x le 625.12)]
|
로 바꿔준 뒤 [math(10)]미만의 최댓값 [math(x)]를 찾는 것이다.
만약 [math(x)]가 자연수로 딱 떨어지지 않고 소수가 된다면 자연수 [math(y)], [math(0<z<10)]인 유리수 [math(z)]를 이용하여 [math(x = y + 0.1z)]로 나타낼 수 있으므로
만약 [math(x)]가 자연수로 딱 떨어지지 않고 소수가 된다면 자연수 [math(y)], [math(0<z<10)]인 유리수 [math(z)]를 이용하여 [math(x = y + 0.1z)]로 나타낼 수 있으므로
[math(begin{aligned}(3times20 + x)x &= (3times20 + y + 0.1z)(y + 0.1z) \ &= (3times20 + y)y + (3times20 + 2y + 0.1z)0.1z le 625.12end{aligned})]
|
가 되는데 [math((3times20 + y)y)]는 자연수이므로 양변에서 빼면
[math((3times20 + 2y + 0.1z)0.1z le 625.12 - (3times20 + y)y)]
|
가 되고 [math(3times10 + y = a')]라 놓으면 위 부등식은 [math((2a' + 0.1z)0.1z le 625.12 - (3times20 + y)y)]가 되어 맨 처음에 이용했던 [math((2a + 0.1x)0.1x le 6.2512)]와 완전히 같은 꼴이 된다.
이 말은 곧 [math(x)]값을 소수 아래 자리까지 정확하게 찾으려고 애쓸 필요가 없으며 적당히 부등식을 만족하는 최대의 자연수를 구한 뒤 부등식의 양변에서 뺀 다음 다시 [math(100)]을 곱하고 부등식을 만족하는 최대의 자연수를 찾고……하는 식으로 반복해나갈 수 있음을 의미한다.
이는 앞의 방법에 비하면 계산량이 차원이 다르다. (실제로 대략 [math(mathcal{O}(k^2))]에서 [math(mathcal{O}(k))]가 된 것이다.)
방법은 설명했으니 예시로 [math(boldsymbol{313.29})]의 제곱근을 구해보자. 개평법을 쓸 때에는 다음과 같이 피개평수에서 빼는 연산을 위한 열과(이하 뺄셈 열), 빼기 위한 수를 계산하기 위한(상술한 [math(2a+b)]를 계산하는) 열(이하 덧셈 열) 2줄을 준비해놓는 것이 좋다. 아래 식에서 왼쪽 단이 덧셈 열이고 오른쪽 단이 뺄셈 열이다.
이 말은 곧 [math(x)]값을 소수 아래 자리까지 정확하게 찾으려고 애쓸 필요가 없으며 적당히 부등식을 만족하는 최대의 자연수를 구한 뒤 부등식의 양변에서 뺀 다음 다시 [math(100)]을 곱하고 부등식을 만족하는 최대의 자연수를 찾고……하는 식으로 반복해나갈 수 있음을 의미한다.
이는 앞의 방법에 비하면 계산량이 차원이 다르다. (실제로 대략 [math(mathcal{O}(k^2))]에서 [math(mathcal{O}(k))]가 된 것이다.)
방법은 설명했으니 예시로 [math(boldsymbol{313.29})]의 제곱근을 구해보자. 개평법을 쓸 때에는 다음과 같이 피개평수에서 빼는 연산을 위한 열과(이하 뺄셈 열), 빼기 위한 수를 계산하기 위한(상술한 [math(2a+b)]를 계산하는) 열(이하 덧셈 열) 2줄을 준비해놓는 것이 좋다. 아래 식에서 왼쪽 단이 덧셈 열이고 오른쪽 단이 뺄셈 열이다.
- [math(begin{array}{l|r} begin{array}{lr}& \ end{array} & begin{array}{l}sqrt{3{color{red}|}13.{color{red}|}29}end{array} end{array})][math(313.29)]를 소수점을 기준으로 2자리씩 끊어준다.[6]이나 [math(sqrt{dfrac19} = sqrt{0.dot1})] 따위를 구하기 곤란하다 물론 빈자리는 [math(0)]으로 채우면 된다.] 이는 원래의 수를 [math(100)]으로 나누고 곱해 두자리 정수만 남기고 소수점 아래를 버린것과 같다.
- [math(begin{array}{l|r} begin{array}{lr}& \ end{array} & begin{array}{l}quad1\ sqrt{3{color{red}|}13.{color{red}|}29}end{array} end{array})]제곱을 했을 때 맨 앞 숫자를 넘지 않는 최대의 자연수의 제곱수 [math(a^2)]을 구한다.[8]라고 했을 때 [math(a^2 le alpha)]] [math(a)]가 곧 해의 첫 번째자리의 수가 된다. 이 경우 맨 앞 숫자가 [math(3)]이므로 [math(1(=1^2)le3<4(=2^2))]에서 [math(a=1)]이다.
- [math(begin{array}{l|r} begin{array}{lr}& \ & 1 \ +) & 1\ hline & 2 end{array} & begin{array}{l}quad1 \ sqrt{3{color{red}|}13.{color{red}|}29} \ quad1 \ hline quad 2;13 \end{array} end{array})]맨 앞 숫자에서 [math(a^2)]을 빼고 그 다음 2자리의 수를 내려적는다.[10] 이는 원래의 수에서 [math(a^2)]을 빼고 [math(100)]을 곱한 것과 같다. 이와 동시에 다음 뺄 수를 계산하기 위해 덧셈 열에 [math(2a)]를 기록한다.
- [math(begin{array}{l|r} begin{array}{lr}& \ & 1
\ +) & 1\ hline & 2{color{red}7} \ +) & {color{red}7} \ hline & 34 end{array} & begin{array}{l}quad1;{color{red}7}. \ sqrt{3{color{red}|}13.{color{red}|}29} \ quad1 \ hline quad 2;13 \ quad 1;89 \ hline quad;24;;29 end{array} end{array})]앞서 [math(a^2)]을 빼고 [math(100)]을 곱했으므로 [math(100(2a+b)b = 100(2a+0.1x)0.1x = (20a+x)x)]가 뺄셈 열의 결과값보다 크지 않은 최대의 수, 즉 제곱근의 두 번째자리 수를 구한다. 이 경우 [math(189(=27times7)le213<224(=28times8))]이므로 [math(x=7)]이 된다. [math((20a+x)x)]를 뺄셈 열의 결과값에서 뺀 뒤 다음 2자리 수를 내려 적는다.
덧셈 열에는 [math(20a+x)]와 [math(x)]를 더한 [math(2(10a+x))]를 새로운 [math(2a)]로 놓고 계산을 반복한다. - [math(begin{array}{l|r} begin{array}{lr}& \ & 1
~\+) & 1~\ hline & 27\+) & 7\ hline & 34{color{red}7} \ & {color{red}7} \ ~end{array} & begin{array}{l}quad1;7.;{color{red}7} \ sqrt{3{color{red}|}13.{color{red}|}29} \ quad1 \ hline quad 2;13 \ quad 1;89 \ hline quad;24;;29 \ quad;24;;29 \ hline quad;;;0 end{array} end{array})]최종적으로 뺄셈 열에서 [math(0)]이 나오면 제곱근 구하기를 완료한 것이다. 루트안의 수가 무한소수거나 자리수를 나눌때 [math(m)]개로 나누었는데([math(313.29)]의 경우 [math(3|13.|29)]로 3개) 루트를 [math(m)]자리까지 구해도 안끝나는 경우는 루트자체가 무한소수이므로 적절한 유효숫자에서 끝내면 된다.
예시는 딱 유한소수로 끝나는 수를 가져왔지만 이 방법은 제곱근이 무리수가 나와도 원하는 유효숫자까지 계속 구해나갈 수 있다.
앞서 [math(sqrt{15.2512})]를 개평법으로 계산해보면
[math(begin{array}{l|r} begin{array}{lr}& \ & 3qquadquad\+) & {color{red}3}qquadquad\ hline & 69qquad
|
2.2.2. n제곱근(n≥3)의 경우
그냥 계산기를 쓰는 것이 낫다.[11] [math(n)]제곱근부터는 개평법에 비해 계산량이 폭발적으로 늘어나기 때문이다. 당장에 개립법만 보더라도 똑같이 피개립수를 적절하게 [math(1000^k)]으로 나누고 곱하기를 반복하면서 자연수 [math(a)], [math(b)]에 대해 [math((a+0.1b)^3)]을 찾아나가는 과정은 똑같은데, 뺄셈 열에서 빼야 하는 수는 [math(1000left{(a+0.1b)^3 - a^3right} = 300a^2b + 30ab^2 + b^3 = mathord{left(300a^2 + 30ab + b^2right)}b)]가 된다. 덧셈 열로 쓰던 단도 개립법부터는 덧셈 열로서의 의미를 상실하여 사실상 곱셈 열이 되며(아래 예시 참조) 앞서 개평법에선 먼저 구했던 수를 2배하고 [math(b)]를 붙여주고 곱하는 것으로 끝이었다면, 이제는 구해야 하는 수의 지수가 포함된 식에 하나하나 대입하면서 계산해야하는 상황이 된 것이다. 이쯤 되면 최대 결과값을 손으로 계산하는 것보다 계산기를 쓰는 게 차라리 나은 수준이 되는데 요즘 웬만한 공학계산기 및 계산기 어플에서는 [math(n)]제곱근을 지원하기 때문에(……) 개립법부터는 그냥 계산기를 쓰는 게 차라리 낫다.
예시로 [math(sqrt[3]3)]을 개립법으로 유효숫자 4자리까지 구해보면 다음과 같다. 곱셈 열(왼쪽 단)에서 [math(f(a,,x) = 300a^2 + 30ax + x^2)]이며 [math(a)]에 들어갈 수는 이전 결과까지 구한 해의 숫자를 나열한 것이다.
예시로 [math(sqrt[3]3)]을 개립법으로 유효숫자 4자리까지 구해보면 다음과 같다. 곱셈 열(왼쪽 단)에서 [math(f(a,,x) = 300a^2 + 30ax + x^2)]이며 [math(a)]에 들어갈 수는 이전 결과까지 구한 해의 숫자를 나열한 것이다.
[math(begin{array}{l|r}
begin{array}{lrr}& & \ & 1 & \ times) & {color{red}1} & longrightarrow \ & f({color{red}1},,4)= 436 & \ times) & {color{red}4} & longrightarrow \ & f({color{red}14},,4) = 60496 & \ times) & {color{red}4} & longrightarrow \ & f({color{red}144},,2) = 6229444 & \ times) & {color{red}2} & longrightarrow \ & f({color{red}1442},,2) = 623817844 & \ times) & {color{red}2} & longrightarrow end{array} & begin{array}{l} end{array})] |
따라서 [math(sqrt[3]3 fallingdotseq 1.442)]가 된다.이게 뭔 짓이람
2.3. 도표적분법
부분적분을 연쇄적으로 해야하는 경우, 도표적분법(Tabular Integration, 또는 tic-tac-toe method), 또는 부분적분 세로셈을 통해서 좀 더 빨리 부분적분을 계산할 수 있다. 이 때, 정적분은 부정적분으로 바꾸어서 계산하고 나중에 정적분으로 계산해야 한다. 세로셈은 부분적분을 여러 번 해야 할 때 더욱 빠르다.
부분적분 세로셈은 [math(f'(x)=c)](상수)가 되면 [math(f'(x))]가 적분 기호 밖으로 나올 수 있다는 점을 이용한다.[12] 표의 왼쪽 열은 미분하는 열이고, 오른쪽 열은 적분하는 열이다. 위의 우선순위에 의해 미분열 맨 위에 미분하려는 함수([math(f(x))])를 적고, 적분열 맨 위에 적분하려는 함수([math(g'(x))])를 적는다. 그 후 미분열 아래로 계속 미분을 하고, 적분열 아래로는 계속 적분하여 내려간다. 그러다가 미분열에 적힌 함수가 상수가 되면 맨 왼쪽에 행마다 +, -, +, -를 반복하여 부호를 붙인다. 그 아래로 적분을 한 번 더 하여 하향 대각선 방향으로 함수를 곱한 뒤 그 결과를 더하면 된다.
부분적분을 한 번 쓴 경우
| 부분적분을 두 번 쓴 경우
|
위 그림처럼 부분적분을 두 번 연속해서 쓸 수도 있다. 마찬가지 방법으로 계속 아래로 내려가면 부분적분을 계속해서 쓸 수 있다.
2.3.1. 교환법칙
어떤 함수가 같은 행에 있다는 것은 이 부분적분 중간에 그 함수를 곱해서 적분하는 과정이 들어있다는 뜻이다. 따라서 같은 행에 한해서 왼쪽 열(미분열)과 오른쪽 열(적분열)의 교환법칙이 성립한다. 단, 이 과정을 아래줄에 적을 때 +, - 부호도 같이 유지된다는 점에 유의하자. 사실 상 같은 식을 두 번 적은 셈이니 하향 대각선으로 가는 곱도 함수교환 직전에는 하지 않는다.
부분적분을 한 번 쓴 경우
| 부분적분을 두 번 쓴 경우
|
2.3.2. 미분열이 상수가 되지 않는 경우
같은 행에 있는 함수는 곱하여 적분한 것을 뜻하므로, 하향 대각선으로 가다가 마지막에는 가로 일직선으로 곱해서 적분기호를 붙이면 된다. 이 때 적분기호를 빼먹지 않도록 하자.
[1] 나눗셈의 대상이 체가 아닐 경우 오른쪽에 나머지를 써준다.[2] 이걸 잘못이해해서 뒤에서부터나 앞에서부터 끊다간 [math(sqrt{123.456})[3] 수식으로 나타내면 맨 앞 숫자를 [math(alpha)[4] 맨 처음에 소수점을 기준으로 2자리씩 끊어준 이유가 바로 여기에 있다.[5] 이걸 잘못이해해서 뒤에서부터나 앞에서부터 끊다간 [math(sqrt{123.456})[6] 이걸 잘못이해해서 뒤에서부터나 앞에서부터 끊다간 [math(sqrt{123.456})[7] 수식으로 나타내면 맨 앞 숫자를 [math(alpha)[8] 수식으로 나타내면 맨 앞 숫자를 [math(alpha)[9] 맨 처음에 소수점을 기준으로 2자리씩 끊어준 이유가 바로 여기에 있다.[10] 맨 처음에 소수점을 기준으로 2자리씩 끊어준 이유가 바로 여기에 있다.[11] 물론, 그 계산기에 들어가는 마이크로프로세서를 설계하는 사람이라면 이 계산법을 익혀두어야 한다.[12] 물론 꼭 상수가 되어야만 세로셈을 쓸 수 있는 것은 아니다. 뒤의 항목 참조.