앞 소절에서 수열을 함수로 읽었으니 좌표평면에 찍어 볼 수 있습니다. 가로가 n, 세로가 an 입니다.
3,7,11,15 는 한 직선 위에 나란히 놓입니다. 일반항이 4n−1 이라 24번 글의 y=mx+b 꼴 그대로이고, 공차 4가 곧 기울기입니다.
2,6,18,54 는 점이 위로 휘며 벌어집니다. 일반항이 2⋅3n−1 이라 21번 글의 지수함수 꼴이고, 한 칸 갈 때마다 값이 3배가 됩니다.
공차는 한 칸에 얼마나 더하는가이고 공비는 한 칸에 몇 배가 되는가입니다. 더하기를 되풀이하면 직선이 나오고 곱하기를 되풀이하면 휘는 곡선이 나온다 — 이 대비는 등차와 등비가 갈리는 자리마다 되돌아옵니다.
공비가 음수일 때
공비가 양수라고 정해 둔 적은 없습니다. r 이 음수면 부호가 한 항마다 번갈아 붙습니다.
1,−2,4,−8,16,−32,…
a1=1, r=−2 인 등비수열입니다. 일반항은 an=(−2)n−1 이고, 13번 글에서 본 대로 지수가 짝수면 양수, 홀수면 음수가 되어 부호가 오갑니다.
∣r∣ 이 1보다 작으면 크기가 줄면서 부호만 오갑니다.
1,−21,41,−81,…
부호를 빼고 크기만 보면 ∣r∣ 배씩 커지거나 작아지는 것은 그대로입니다. 그래서 등비수열이 커지는지 작아지는지를 볼 때는 r 이 아니라 ∣r∣ 을 봅니다. 이 구별은 29번 · 등비급수에서 다시 필요해집니다.
어느 쪽인지 가려내기
수만 몇 개 주어졌을 때 등차인지 등비인지 가리는 방법은 손으로 두 번 해 보는 것입니다.
5,10,20,40
첫째, 이웃한 항의 차 를 적습니다. 5,10,20 으로 일정하지 않으니 등차가 아닙니다.
둘째, 이웃한 항의 비 를 적습니다. 2,2,2 로 일정하니 등비이고 r=2 입니다.
5,10,15,20 이라면 차가 5,5,5 로 일정해 등차이고, 비는 2,1.5,34 으로 일정하지 않습니다.
둘 다 아닌 수열이 훨씬 많습니다.1,4,9,16 은 차가 3,5,7 이고 비가 4,2.25,916 이라 어느 쪽도 아닙니다. 등차와 등비는 흔해서 이름이 붙은 두 갈래일 뿐이지 수열 전체를 나누는 분류가 아닙니다.
점화식 굴리기
점화식이 낯설면 손으로 몇 번 굴리는 것이 가장 빠릅니다. a1=1, an+1=2an+1 을 다섯 항까지 굴려 봅니다.
a2=2×1+1=3
a3=2×3+1=7
a4=2×7+1=15
a5=2×15+1=31
1,3,7,15,31 이 나왔습니다. 눈에 띄는 것이 있습니다 — 전부 2의 거듭제곱보다 1 작습니다. 실제로 an=2n−1 입니다. 점화식에서 일반항을 찾아내는 일반적인 방법은 여기서 다루지 않습니다. 굴려서 값을 얻는 것까지가 이 글의 몫입니다.
앞의 두 항으로 정해지는 점화식
앞 항 하나만 쓰라는 법은 없습니다. 둘을 쓰는 점화식 이 있습니다.
a1=1,a2=1,an+2=an+1+an
바로 앞 항과 그 앞 항을 더합니다. 여덟 항까지 굴려 봅니다.
1,1,2,3,5,8,13,21
2=1+1, 3=1+2, 5=2+3, 8=3+5, 13=5+8, 21=8+13 입니다. 이 수열을 피보나치 수열 이라고 합니다.
앞의 것을 둘 쓰므로 출발값도 둘이 필요합니다.a1 만 주면 a3 을 만들 수가 없습니다. 일반적으로 앞의 m 개를 쓰는 점화식은 출발값이 m 개 있어야 합니다.
이 수열은 등차도 등비도 아닙니다. 차가 0,1,1,2,3,5,8 이고 비가 1,2,1.5,1.667,1.6,1.625,1.615 로 어느 쪽도 일정하지 않습니다. 다만 비가 한 값 근처에서 흔들리며 좁혀지는 것 은 눈에 띕니다. 그 값이 무엇인지 말하려면 28번 글의 도구가 필요합니다.
굴려도 안 변하는 값
an+1=2an+1 을 다시 봅니다. 출발값을 1이 아니라 다른 수로 두면 어떻게 될까요.
a1=5 로 굴리면 11,23,47 로 더 빨리 커집니다. a1=0 이면 1,3,7 입니다. 그런데 굴려도 값이 안 변하는 출발값 이 하나 있습니다.
굴려도 같으려면 an+1 과 an 이 같은 값이어야 하므로, 그 값을 a 라 두고 식에 넣습니다.
a=2a+1
풀면 a=−1 입니다. 확인해 봅니다. a1=−1 이면 a2=2×(−1)+1=−1 이고, 몇 번을 굴려도 −1 입니다.
이렇게 굴려도 제자리인 값을 고정점 이라고 합니다. 이 하나를 알면 다른 출발값의 움직임도 읽힙니다 — −1 보다 큰 데서 출발하면 위로 달아나고, 작은 데서 출발하면 아래로 달아납니다. a1=−2 로 굴려 보면 −3,−5,−9 로 실제로 그렇습니다.
Σ 표기의 해부
이제 본론입니다. a1 부터 an 까지 더한 값을 이렇게 적습니다.
∑k=1nak
9번 글이 이 기호의 이름과 발음을 표로 주었습니다. 여기서 세울 것은 이것이 무슨 계산인가 하나입니다.
소리 내어 읽으면 이렇습니다.
k 가 1부터 n 까지 갈 동안, ak 를 전부 더하라.
아래에 적힌 k=1 이 출발, 위에 적힌 n 이 도착, 오른쪽에 적힌 ak 가 더할 것입니다. k 를 1부터 하나씩 올리며 ak 를 적어 나열하고 사이에 +를 끼우면 끝입니다. 새로운 계산이 아니라 긴 덧셈을 짧게 적은 표기입니다.
펼치는 연습을 합니다.
∑k=14k2=12+22+32+42=1+4+9+16=30
∑k=15(2k+1)=3+5+7+9+11=35
∑k=24k1=21+31+41=1213
거꾸로 접는 연습도 합니다. 1+3+5+7+9 를 보면 홀수 다섯 개이고 k 번째 홀수가 2k−1 이므로
1+3+5+7+9=∑k=15(2k−1)
접을 때 확인할 것은 둘입니다 — k 에 출발값을 넣으면 첫 항이 나오는가, 도착값을 넣으면 마지막 항이 나오는가.k=1 에서 1, k=5 에서 9 이니 맞습니다.
범위가 좁을 때
출발값과 도착값이 가까우면 어떻게 되는지 정해 두어야 합니다. 규약은 표기를 그대로 읽은 것뿐입니다.
위끝과 아래끝이 같으면 항이 하나입니다.
∑k=33k2=32=9
k 가 3에서 출발해 3에서 끝나므로 3 한 번만 돕니다.
위끝이 아래끝보다 작으면 항이 하나도 없고, 그 값은 0입니다.
∑k=54k2=0
k=5 에서 출발해 4까지 가라고 했는데 이미 지나쳤으므로 한 번도 돌지 않습니다. 아무것도 더하지 않은 값이라 빈 합 이라 하고 0으로 둡니다.
0이 자연스러운 이유가 있습니다. 뒤에서 볼 「구간 쪼개기」가 m=n 인 자리에서도 성립하려면 이 값이 0이어야 합니다. 더한 것이 없을 때 0으로 두는 것은 덧셈에서 아무것도 안 한 상태 이기 때문입니다.
자리마다 곱해 더하기
Σ 안에 들어가는 것이 한 수열이어야 할 이유는 없습니다. 두 줄의 수를 자리마다 곱해 더하는 계산 이 자주 나오는데, 이것도 Σ 한 줄입니다.
a=(2,5,3),b=(4,1,6)
자리마다 곱해 더합니다.
2×4+5×1+3×6=8+5+18=31
접으면 이렇게 됩니다.
∑k=13akbk
첨자 k 가 두 줄을 동시에 훑습니다. 첫 자리끼리, 둘째 자리끼리, 셋째 자리끼리 곱해 더하라는 지시입니다. 줄의 길이가 다르면 이 식은 성립하지 않습니다 — 짝이 없는 자리가 생기기 때문입니다.
이중 시그마
Σ 안에 Σ가 또 들어갈 수 있습니다. 표의 칸을 훑는 것 으로 읽으면 됩니다.
∑i=12∑j=13ij
안쪽부터 계산합니다. i 를 고정하고 j 를 1부터 3까지 돌립니다.
i=1:1⋅1+1⋅2+1⋅3=6
i=2:2⋅1+2⋅2+2⋅3=12
바깥에서 이 둘을 더해 18입니다.
표로 그리면 가로 세 칸, 세로 두 칸짜리 표이고 각 칸에 ij 가 적혀 있습니다. 안쪽 Σ가 한 줄을 훑고 바깥 Σ가 줄을 바꿉니다. 표의 모든 칸을 빠짐없이 한 번씩 더한 값이 18이라는 뜻입니다.
접힌 채로 쓰는 규칙
펼치지 않고도 손댈 수 있는 규칙이 있습니다. 전부 덧셈에서 이미 알던 것을 접힌 표기로 옮긴 것뿐입니다.
첫째, 첨자의 이름은 아무래도 좋습니다.
∑k=1nak=∑i=1nai
k 는 1부터 n 까지 훑고 사라지는 임시 이름이라 더미 첨자라고 합니다. 바깥에는 그 값이 남지 않으므로 이름을 바꿔도 결과가 같습니다.
넷째, 첨자를 옮겨 적을 수 있습니다.∑k=1nak+1 은 a2 부터 an+1 까지를 더한 것이므로
∑k=1nak+1=∑j=2n+1aj
곱셈은 쪼개지지 않는다
여기 없는 것 하나를 못 박아 둡니다. 곱셈은 이렇게 쪼개지지 않습니다.
∑k=1nakbk=(∑k=1nak)(∑k=1nbk)
n=2 로 세어 보면 왼쪽은 a1b1+a2b2, 오른쪽은 거기에 a1b2+a2b1 이 더 붙습니다. 틀린 곳을 찾는 가장 빠른 방법은 작은 n 으로 펼쳐 보는 것입니다.
앞 절의 자리마다 곱해 더하는 계산이 바로 왼쪽이었습니다. (2,5,3) 과 (4,1,6) 으로 확인하면 왼쪽은 31이고 오른쪽은 10×11=110 입니다.
첫 항이나 끝 항 떼어 내기
다섯째 손놀림이 있습니다. 양 끝의 항 하나를 떼어 내고 범위를 한 칸 좁히는 것 입니다.
∑k=1nak=a1+∑k=2nak
∑k=1nak=∑k=1n−1ak+an
당연해 보이지만 쓰임이 있습니다. 두 Σ의 범위가 한 칸씩 어긋나 있을 때, 한쪽에서 항을 떼어 범위를 맞추면 나머지가 통째로 지워집니다.
∑k=1nak−∑k=2nak=a1
앞의 것에서 첫 항을 떼면 뒤의 것과 범위가 같아지고, 같은 것끼리 빼면 0이 되어 a1 만 남습니다. 범위를 맞춰 놓고 지운다 — 다음 절의 망원합이 이 손놀림을 크게 쓰는 자리입니다.
구간 쪼개기와 순서 바꾸기
긴 구간은 둘로 자를 수 있습니다.
∑k=1nak=∑k=1mak+∑k=m+1nak
m 은 1과 n 사이의 아무 수입니다. 앞쪽이 m 에서 끝나고 뒤쪽이 m+1 에서 시작하므로 겹치지도 빠지지도 않습니다.m=n 으로 두면 뒤쪽이 ∑k=n+1n 이 되어 빈 합 0이고, 앞에서 빈 합을 0으로 정해 둔 덕에 이 자리에서도 식이 그대로 성립합니다.
이중 시그마에서는 더하는 순서를 바꿔도 됩니다.
∑i=12∑j=13ij=∑j=13∑i=12ij
바꿔서 계산해 봅니다. 안쪽이 i 를 훑으므로 j(1+2)=3j 이고, 바깥에서 j 를 1부터 3까지 더하면 3(1+2+3)=18 입니다. 앞에서 얻은 값과 같습니다.
표로 읽으면 이유가 보입니다. 줄을 따라 더하고 나서 그 결과를 더하든, 칸을 따라 더하고 나서 더하든 모든 칸을 한 번씩 더한 것은 같습니다. 다만 범위가 서로에게 걸려 있으면 — 예를 들어 안쪽 범위에 바깥 첨자가 들어 있으면 — 순서를 바꿀 때 범위도 함께 고쳐야 합니다.
쓸모가 있습니다. 1보다 작은 수를 여럿 곱하면 값이 아주 빨리 0에 가까워져 손으로도 계산기로도 다루기 어려워집니다. 0.9 를 백 번 곱하면 약 0.0000266 입니다.
로그를 씌우면 곱이 합이 되어 다루기 쉬운 크기로 내려옵니다. log0.9≈−0.0458 이므로 백 번이면 −4.58 이고, 이 값 하나로 원래 수가 10−4.58 쯤이라는 것을 읽습니다. 곱을 합으로 바꿔 놓고 다루다가 필요할 때 되돌리는 이 방식은 아주 작은 수를 여럿 곱하는 자리마다 되풀이됩니다.
n!과 2ⁿ
∏k=1nk 에는 이름과 짧은 표기가 있습니다. n 팩토리얼 이라 하고 n! 로 적습니다.
5!=1×2×3×4×5=120
얼마나 빨리 커지는지 2n 과 나란히 놓고 봅니다.
n
n!
2n
큰 쪽
1
1
2
2n
2
2
4
2n
3
6
8
2n
4
24
16
n!
5
120
32
n!
10
3,628,800
1,024
n!
n=4 에서 뒤집힌 뒤로는 격차가 벌어지기만 합니다. 이유는 곱하는 수에 있습니다 — 2n 은 한 칸 갈 때마다 늘 2를 곱하는데, n! 은 한 칸 갈 때마다 점점 큰 수를 곱합니다. 열째 칸에서는 2와 10을 곱하는 차이입니다.
무한으로 가는 자리
지금까지 더한 항은 언제나 유한했습니다. 도착값 n 자리에 ∞ 를 적으면 어떻게 될까요.
∑k=1∞ak
「끝까지 더하라」인데 끝이 없습니다. 그런데도 값이 있는 경우가 있습니다. 21+41+81+⋯ 은 아무리 더해도 1을 넘지 않고 1에 다가갑니다.
무한히 더해도 값이 있는지 는 29번 · 등비급수의 몫이고, 그 전에 「한없이 진행하면 어디에 붙는가」를 다루는 것이 다음 글입니다.
실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.
최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.
0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.