단원 1-3Matrix Cubed: Walks vs Paths & Triangles
A³, 걷기 vs 경로, 삼각 순환
- 오늘의 질문 (Today's Question)
- 걷기·경로·순환의 정의 (Walk, Path, Cycle: Definitions)
- 손으로 만들기 (Building by Hand)
- 완전 전개 — 삼각 순환 (Full Expansion: a Triangle)
- — 함정 (The Trap: 2 Walks, 0 Paths)
- 전체와 19개 걷기 전수 분류 (All 19 Walks Classified)
- 왜 행렬 곱은 경로를 못 세는가 (Why Matrix Powers Cannot Count Paths)
- 삼각 순환 세기 — (Counting 3-Cycles)
- R 검증 (Verification in R)
- 교실 해석 (Classroom Interpretation)
- 연습문제 (Exercises)
- 연습문제 해설과 답 (Solutions)
1. 오늘의 질문 (Today's Question)
단원 1-2에서 를 "에서 로 가는 2단계 경로의 개수"라고 읽었다. 자연스러운 다음 질문은 이것이다:
아니다. 오늘 단원의 목적은 이 "아니다"를 정확히 이해하는 것이다. 까지는 우연히 맞았고, 부터 어긋난다. 어디서 어긋나는지, 왜 어긋나는지, 그럼 의 값은 정확히 무엇을 세는지를 손으로 확인한다.
네트워크는 단원 1-1·1-2와 같은 학생 5명의 지명 데이터를 계속 쓴다. 지명 7건:
M1→M2 M1→M3 M1→M5 M2→M3 M3→M1 M3→M4 M5→M1
은 단원 1-2 §7에서 손으로 다 구해 놓은 것이므로 오늘은 그대로 가져다 쓴다.
2. 걷기·경로·순환의 정의 (Walk, Path, Cycle: Definitions)
어긋남을 이해하려면 먼저 세 가지를 구별하는 말이 필요하다. 지금까지 뭉뚱그려 "경로"라고 불렀던 것을 쪼갠다.
정의. 지명 화살표를 따라 이어 붙인 학생들의 나열 (모든 에 대해 )를 길이 의 걷기(walk)라 한다. 길이 = 걸음 수(화살표 수)이고, 지나는 학생 수는 이다.
- 걷기(walk) — 같은 학생을 몇 번이든 다시 지나도 된다. 아무 제약 없음.
- 트레일(trail) — 같은 화살표를 두 번 쓰지 않는다. (학생은 다시 지날 수 있다)
- 경로(path) — 같은 학생을 두 번 지나지 않는다. 가장 엄격하다.
- 순환(cycle) — 출발점과 도착점만 같고(), 그 외에는 재방문이 없다. 길이 3인 순환을 삼각 순환(3-cycle)이라 한다.
우리 네트워크에서 실제로 존재하는 3걸음 걷기 몇 개를 이 자로 재 보면:
| 걷기 | 지나는 학생 | 재방문 | 분류 |
|---|---|---|---|
| M1→M2→M3→M4 | M1, M2, M3, M4 | 없음 | 경로 (path) |
| M1→M2→M3→M1 | M1, M2, M3, M1 | 출발점=도착점만 | 순환 (3-cycle) |
| M1→M3→M1→M3 | M1, M3, M1, M3 | M1·M3 각각 두 번 | 걷기일 뿐 |
| M1→M5→M1→M3 | M1, M5, M1, M3 | M1 두 번 | 걷기일 뿐 |
세 번째·네 번째를 "M1에서 M3으로 가는 3단계 경로"라고 부르면 틀린다. M1을 다시 밟았으니 제자리로 돌아왔다 다시 출발한 것이지, 새로운 사람을 셋 거쳐 간 것이 아니다. 교실 언어로 말하면 "친구의 친구의 친구"가 아니라 "내 친구 → 나 → 내 친구"일 뿐이다.
정리 (오늘의 핵심).
경로가 아니라 걷기다. 에서는 걷기와 경로가 (거의) 일치해서 차이가 안 보였을 뿐이다.
3. 손으로 만들기 (Building by Hand)
3-1. 먼저 보통 숫자로 — 세제곱은 곱셈을 한 번 더 (Ordinary Numbers First)
새 규칙은 없다. 단원 1-2 §3의 "왼쪽 행렬의 행을 가로로, 오른쪽 행렬의 열을 세로로 읽어 짝끼리 곱해 더한다"를 한 번 더 하는 것이 전부다. 익숙한 숫자로 확인하자.
(의 첫 칸: .) 이제 이므로 의 행과 의 열을 짝지으면 된다:
같은 식으로 네 칸을 다 채우면:
| 칸 | 의 행 (가로) | 의 열 (세로) | 짝끼리 곱의 합 | 값 |
|---|---|---|---|---|
| 37 | ||||
| 54 | ||||
| 81 | ||||
| 118 |
3-2. — 무엇을 곱하는가 (What Gets Multiplied)
도 똑같다. 왼쪽에 , 오른쪽에 를 놓는다:
단원 1-2의 식과 모양은 같지만 의 정체가 다르다. 이 차이가 오늘 계산의 전부다:
| 왼쪽 조각 | 의 정체 | 오른쪽 조각 | 합계 걸음 | |
|---|---|---|---|---|
| = 1걸음 | 1걸음 뒤 도착지 | = 1걸음 | 1+1 = 2 | |
| = 2걸음 | 2걸음 뒤 도착지 | = 1걸음 | 2+1 = 3 |
즉 "에서 두 걸음 걸어 에 도착한 걷기의 수" × "에서 로 가는 마지막 한 걸음"이다. 그리고 여기서 이미 함정의 씨앗이 보인다 — 이어 붙일 때 "앞의 두 걸음에서 이미 를 지났는지" 아무도 확인하지 않는다.
4. 완전 전개 — 삼각 순환 (Full Expansion: a Triangle)
먼저 잘 작동하는 경우부터. M3에서 출발해 3걸음 뒤 M3으로 돌아오는 걷기를 센다. 왼쪽 에서 M3의 행, 오른쪽 에서 M3의 열을 꺼낸다:
다섯 항을 하나도 빼지 않고 전개한다:
M3→…→ 2걸음 | →M3 1걸음 | 곱 | 왜 그 값인가 | |
|---|---|---|---|---|
| 1 | 0 | 1 | 0 | M1→M3은 있지만, 2걸음으로 M1에 갈 수 없다(M3→M1은 1걸음) |
| 2 | 1 | 1 | 1 | 2걸음 M3→M1→M2 + 1걸음 M2→M3 → 연결됨 |
| 3 | 1 | 0 | 0 | 2걸음으로 M3에 돌아오긴 하지만(M3→M1→M3) M3→M3 자기 지명이 없다 |
| 4 | 0 | 0 | 0 | 2걸음으로 M4에 못 가고, M4→M3도 없다 |
| 5 | 1 | 0 | 0 | 2걸음으로 M5까지는 간다(M3→M1→M5) 그러나 M5→M3이 없다 |
| 합 | 1 | |||
경로 복원. 살아남은 항 를 두 조각으로 되짚는다. 은 단원 1-2 §7에서 M3→M1→M2였고, 여기에 인 M2→M3을 이어 붙이면:
3걸음 걷기 M3→M1→M2→M3 하나. 세 학생이 모두 다르고 출발점으로만 돌아왔으니 진짜 삼각 순환이다. 단원 1-2 §13-2에서 구한 M1→M2→M3→M1과 같은 삼각형을 출발점만 바꿔 본 것이다 — §8에서 이 중복이 왜 3이 되는지 다룬다.
5. — 함정 (The Trap: 2 Walks, 0 Paths)
이번엔 어긋나는 자리다. M1에서 M3으로 가는 3걸음을 센다. 왼쪽 의 M1 행, 오른쪽 의 M3 열:
M1→…→ 2걸음 | →M3 1걸음 | 곱 | 왜 그 값인가 | |
|---|---|---|---|---|
| 1 | 2 | 1 | 2 | 2걸음으로 M1에 돌아오는 길이 2개, 거기서 M1→M3 → 여기서 2가 나온다 |
| 2 | 0 | 1 | 0 | M2→M3은 있지만 2걸음으로 M2에 도달할 수 없다(M2를 지명한 사람은 M1뿐) |
| 3 | 1 | 0 | 0 | 2걸음으로 M3까지는 간다(M1→M2→M3) 그러나 M3→M3이 없다 |
| 4 | 1 | 0 | 0 | M4에 도달해도 M4는 아무도 지명하지 않는다 |
| 5 | 0 | 0 | 0 | 2걸음으로 M5에 못 가고, M5→M3도 없다 |
| 합 | 2 | |||
걷기 복원. 문제는 항의 2다. 는 단원 1-2 §4에서 "M1이 맺은 상호 지명 2건", 즉 2걸음으로 제자리로 돌아오는 걷기 M1→M3→M1과 M1→M5→M1이었다. 각각에 마지막 걸음 M1→M3을 이어 붙이면:
| 2걸음 조각 () | + 마지막 걸음 | 완성된 3걸음 걷기 | 재방문 | 판정 |
|---|---|---|---|---|
| M1→M3→M1 | M1→M3 | M1→M3→M1→M3 | M1·M3 각 두 번 | 경로 아님 |
| M1→M5→M1 | M1→M3 | M1→M5→M1→M3 | M1 두 번 | 경로 아님 |
의 정확한 뜻: "3걸음 걷기가 2개"다. "3단계 경로가 2개"는 틀렸다 — 3단계 경로는 0개다.
직접 확인해 보면 M1에서 서로 다른 두 사람을 거쳐 M3에 닿는 길은 없다. M1이 지명한 사람은 M2, M3, M5인데 — M2는 M3만 지명하므로 2걸음이면 이미 도착(3걸음 못 채움), M3은 목적지 자신, M5는 M1만 지명하므로 되돌아온다. 그래서 0개. 그런데도 행렬은 2를 내놓는다.
6. 전체와 19개 걷기 전수 분류 (All 19 Walks Classified)
모든 원소의 값이 어떤 걷기들인지 전부 적으면 이렇다. 색으로 분류했다 — 초록 = 진짜 경로, 보라 = 삼각 순환, 빨강 = 재방문 걷기.
| 원소 | 값 | 3걸음 걷기 목록 | 분류 |
|---|---|---|---|
| 1 | M1→M2→M3→M1 | 삼각 순환 | |
| 2 | M1→M3→M1→M2 M1→M5→M1→M2 | 둘 다 M1 재방문 | |
| 2 | M1→M3→M1→M3 M1→M5→M1→M3 | §5의 함정 | |
| 1 | M1→M2→M3→M4 | 경로 | |
| 2 | M1→M3→M1→M5 M1→M5→M1→M5 | 둘 다 M1 재방문 | |
| 1 | M2→M3→M1→M2 | 삼각 순환 | |
| 1 | M2→M3→M1→M3 | M3 재방문 | |
| 1 | M2→M3→M1→M5 | 경로 | |
| 2 | M3→M1→M3→M1 M3→M1→M5→M1 | 둘 다 M1 재방문 | |
| 1 | M3→M1→M2→M3 | 삼각 순환 (§4) | |
| 1 | → 연습문제 2에서 직접 구한다 | ||
| 2 | M5→M1→M3→M1 M5→M1→M5→M1 | 둘 다 M1 재방문 | |
| 1 | → 연습문제 1에서 직접 구한다 | ||
| 1 | M5→M1→M3→M4 | 경로 | |
연습문제로 남긴 두 칸을 빼고 세면 17개 걷기 중 진짜 경로는 3개, 삼각 순환 3개, 재방문 걷기가 11개다. 즉 의 값 대부분은 "왔다 갔다 한 것"이다.
M4의 행이 전부 0인 이유는 단원 1-2와 같다 — M4는 아무도 지명하지 않아 어떤 걷기의 출발점도 될 수 없다. 반면 의 M4 열은 로 0이 아니다. "남들은 M4에 도달할 수 있지만 M4는 아무 데도 갈 수 없다" — 방향 네트워크에서 행과 열을 반드시 따로 읽어야 하는 이유다.
7. 왜 행렬 곱은 경로를 못 세는가 (Why Matrix Powers Cannot Count Paths)
이유는 §3-2의 식 하나에 다 들어 있다:
왼쪽 조각은 개수(숫자)일 뿐, "누구를 거쳐 왔는지"를 기억하지 않는다. 는 "2걸음으로 제자리에 돌아오는 길이 둘"이라는 숫자 2이고, 그 길이 M3을 지났는지 M5를 지났는지는 이미 잊혀졌다. 그러니 마지막 걸음 M1→M3을 붙일 때 "아까 M3 지났잖아"라고 걸러낼 방법이 없다. 행렬 곱셈에는 방문 기록(메모리)이 없다.
7-1. 나쁜 항은 행렬의 어느 칸에서 오는가 (Locating the Bad Term in the Matrix)
말로만 하면 와닿지 않으니 행렬을 직접 놓고 확인한다. §5의 를 다시 본다. 왼쪽 의 M1 행과 오른쪽 의 M3 열을 곱한다:
| 곱 | 이 항이 만드는 걷기 | |||
|---|---|---|---|---|
| 1 | 2 | 1 | 2 | M1로 되돌아오는 2걸음 2개 + M1→M3 |
| 2 | 0 | 1 | 0 | 2걸음으로 M2에 도달할 수 없다 |
| 3 | 1 | 0 | 0 | M3까지는 가지만 M3→M3(자기 지명)이 없다 |
| 4 | 1 | 0 | 0 | M4까지는 가지만 M4→M3이 없다 |
| 5 | 0 | 0 | 0 | 2걸음으로 M5에 못 가고, M5→M3도 없다 |
| 합 | 2 | |||
살아남은 항은 하나뿐이고, 그 항의 왼쪽 값 는 행 번호와 열 번호가 같은 대각선 칸이다. 대각선 = 출발점으로 되돌아온 걷기. 즉 이 예에서 헛걸음 2개는 정확히 의 대각선을 타고 들어왔다. 그렇다면 그 대각선의 정체가 무엇인지부터 밝혀야 한다.
7-2. 의 대각선 = 상호 지명 수 (The Diagonal of Counts Mutual Nominations)
을 정의대로 다섯 항 전부 전개한다(0인 항도 생략하지 않는다):
항 이 1이 되려면 M1→와 →M1이 동시에 있어야 한다. 곧 상호 지명이다. 살아남은 가 바로 M1의 상호 지명 상대다. 이 곱을 행렬 전체에 대해 한 번에 하려면 와 그 전치 를 같은 자리끼리 곱하면(아다마르 곱 ) 된다:
이 행 합을 ("의 상호 지명 친구 수")라 부르자. 의 대각선과 나란히 놓으면 완전히 같다:
| M1 | M2 | M3 | M4 | M5 | |
|---|---|---|---|---|---|
| 의 행 합 | 2 | 0 | 1 | 0 | 1 |
| 2 | 0 | 1 | 0 | 1 |
= 의 상호 지명 수. M4는 아무도 지명하지 않으니 0, M2는 M3을 지명했지만 M3이 되받지 않았으니 0이다. 이 사실은 단원 1-2 §4에서 이미 봤던 것을 행렬 식으로 다시 쓴 것뿐이다.
7-3. 그럼 왜 까지는 맞았나 (Why Was Safe)
정정. 이 노트의 이전 판에는 "길이 2 걷기 에서 재방문이 생기려면 또는 여야 한다"고만 적혀 있었다. 이 문장은 를 전제로 할 때만 참이다. 이면 가 무엇이든 출발점을 다시 밟으므로 애초에 경로가 아니다 — 그리고 방금 본 대로 은 0이 아니다. 즉 2걸음 걷기 중에도 경로가 아닌 것이 실제로 존재한다. 전제를 앞에 명시하도록 아래와 같이 고쳐 쓴다.
를 대각선과 나머지로 갈라 놓고 보면 사정이 한눈에 보인다:
대각선의 4개는 M1→M3→M1, M1→M5→M1, M3→M1→M3, M5→M1→M5 — 모두 상호 지명을 왕복한 것이다(§7-2). 그리고 인 칸 8개는 하나도 빠짐없이 경로다. 왜 그런가:
| 에서 어느 둘이 같은가 | 걷기 모양 | 필요한 조건 | 가능한가 |
|---|---|---|---|
| ✗ 자기 지명 없음 | |||
| ✗ 자기 지명 없음 | |||
| (상호 지명) | ○ 가능 — 대각선 4개가 그것 |
정확한 진술. 라면 2걸음 걷기는 항상 경로다. 자기 지명이 없다는 약속 이 와 를 동시에 막기 때문이다. 따라서 2걸음 경로 행렬은 에서 대각선만 0으로 지운 것과 같다: — 8개.
자기 지명 금지가 정말 방패였는지 확인해 보자. M3이 자기 자신을 지명했다고 가정하고 한 칸만 바꿔 본다:
| 2걸음 걷기 | 어디서 왔나 | 판정 |
|---|---|---|
| M1→M2→M3 | 경로 | |
| M1→M3→M3 | 경로 아님 (M3 재방문) |
인데도 경로가 아닌 걷기가 끼어들었다. 즉 가 안전했던 것은 운이 아니라 이라는 구조 덕분이었다.
7-4. 길이 3에서는 무엇이 뚫리는가 (When Length 3 Breaks)
3걸음 걷기 에는 학생이 네 명 등장한다. 재방문이란 이 넷 중 어느 둘이 같다는 뜻이므로, 가능한 짝 가지를 하나도 빠뜨리지 않고 따져야 한다:
| 어느 둘이 같은가 | 걷기 모양 | 필요한 조건 | 가능한가 |
|---|---|---|---|
| ✗ 자기 지명 | |||
| ✗ 자기 지명 | |||
| ✗ 자기 지명 | |||
| (닫힌 걷기) | — | 지금은 로 가정 → §8에서 따로 | |
| → 와 가 상호 지명 | ○ 가능 | ||
| → 와 가 상호 지명 | ○ 가능 |
살아남은 두 형태를 우리 예제의 실제 걷기로 확인한다(§6의 19개 목록에서 그대로 가져온 것):
| 형태 | 실제 걷기 | 끼어든 상호 지명 | 어디를 거쳤나 |
|---|---|---|---|
| 만 | M1→M5→M1→M3 | M1↔M5 | 대각선 |
| 만 | M2→M3→M1→M3 | M3↔M1 | 비대각선 |
| 둘 다 | M1→M3→M1→M3 | M1↔M3 | 대각선 |
두 형태는 겹칠 수 있다. M1→M3→M1→M3은 이면서 동시에 다. 뒤에서 셀 때 이 겹침을 한 번 빼 주어야 한다. 또 형은 의 대각선이 아닌 칸을 통해서도 들어오므로 "헛걸음은 대각선에서만 온다"고 일반화하면 안 된다 — §7-1의 은 그렇게 보였을 뿐이다.
결론. 일 때 3걸음 걷기가 경로가 아니게 되는 것은 오직 상호 지명이 끼어들 때다. 그리고 (대각선)일 때는 위 표에서 가 모두 막히므로 세 학생이 서로 다를 수밖에 없다 → 3걸음 닫힌 걷기는 항상 진짜 삼각 순환이다(§4에서 본 그대로).
7-5. 헛걸음을 행렬만으로 세는 공식 (Counting Bad Walks with Matrices Alone)
§7-4의 두 형태를 그대로 개수로 옮기면 된다. 일 때:
| 형태 | 몇 개인가 | 이유 |
|---|---|---|
| : | 는 의 상호 지명 상대 아무나(가지), 마지막 걸음 가 있어야 함 | |
| : | 첫 걸음 가 있어야 하고, 는 의 상호 지명 상대 아무나(가지) | |
| 겹침: | 와 가 서로 상호 지명일 때만 1개, 위에서 두 번 세였으므로 빼 준다 |
여기서 이다(§7-2). 이제 §6에서 분류했던 칸들을 이 공식으로 다시 세어 본다. 손으로 하나씩 걷기를 복원하지 않아도 행렬 세 개(, , )만으로 답이 나온다:
| 헛걸음 | 진짜 경로 | ||||||
|---|---|---|---|---|---|---|---|
| M1→M2 | 1 | 2 | 0 | 0 | 2 | 2 | 0 |
| M1→M3 | 1 | 2 | 1 | 1 | 2 | 2 | 0 |
| M1→M4 | 0 | 2 | 0 | 0 | 0 | 1 | 1 |
| M1→M5 | 1 | 2 | 1 | 1 | 2 | 2 | 0 |
| M2→M3 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
| M2→M5 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
| M3→M1 | 1 | 1 | 2 | 1 | 2 | 2 | 0 |
| M5→M1 | 1 | 1 | 2 | 1 | 2 | 2 | 0 |
| M5→M4 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
| M3→M4 | 연습문제 2 — 공식으로 먼저 예측하고, 걷기를 복원해 맞춰 볼 것 | ||||||
| M5→M3 | 연습문제 1 — 같은 방식으로 | ||||||
| 위 9칸 합계 | 11 | 14 | 3 | ||||
읽는 법. 인 줄(M1→M4, M2→M5, M5→M4)은 헛걸음이 0이다 — 두 형태 모두 "에서 로 가는 직접 지명"을 요구하는데 그것이 없기 때문이다. 반대로 인 줄은 헛걸음 수가 와 정확히 같아서 진짜 경로가 0개다. §6에서 손으로 확인했던 "직접 친구 사이일수록 3걸음 걷기가 다 헛것"이라는 관찰이 공식 한 줄로 설명된다.
all_simple_paths())을 써야 한다.
8. 삼각 순환 세기 — (Counting 3-Cycles)
의 대각선만 뽑으면:
값이 1인 학생은 M1, M2, M3 — 그리고 삼각 순환에 참여하는 학생이 정확히 이 셋이다. M4, M5는 0이니 어떤 삼각 순환에도 들어 있지 않다. 그런데 삼각 순환은 1개인데 합은 3이다. 같은 고리가 세 번 세어졌기 때문이다:
| 어느 대각선에서 | 세어진 걷기 | 실체 |
|---|---|---|
| M1→M2→M3→M1 |
같은 삼각형 출발점만 다름 | |
| M2→M3→M1→M2 | ||
| M3→M1→M2→M3 |
3으로 나누는 이유: 삼각형에는 출발점이 될 수 있는 학생이 3명이므로 같은 고리가 세 번 세어진다. 단원 1-2 §8에서 상호 지명 쌍을 로 셌던 것과 같은 논리이고, 나누는 수만 2에서 3으로 바뀐다.
무방향이면 6으로 나눈다 (Undirected: Divide by 6)
지명 방향을 무시하고 "둘 중 한 명이라도 지명했으면 친구"로 보면 대칭 행렬 ()가 된다:
이번엔 6으로 나눈다. 무방향 삼각형 하나는 출발점 3가지 × 도는 방향 2가지 = 6번 세어지기 때문이다(M1→M2→M3→M1과 M1→M3→M2→M1이 같은 삼각형). 삼각형은 하나다.
주의. igraph의 count_triangles()·triangles()는
방향을 무시하고 센다. 방향 삼각 순환(일방 지명이 도는 고리)을 세고 싶으면
을 직접 계산하거나 삼자관계 조사(triad census)를 써야 한다.
두 질문은 다른 질문이다 — "세 명이 서로 아는가"(무방향 삼각형)와
"지명이 한 방향으로 도는가"(방향 순환).
9. R 검증 (Verification in R)
A <- matrix(c(0,1,1,0,1,
0,0,1,0,0,
1,0,0,1,0,
0,0,0,0,0,
1,0,0,0,0), 5, 5, byrow = TRUE)
dimnames(A) <- list(paste0("M",1:5), paste0("M",1:5))
A2 <- A %*% A
A3 <- A2 %*% A
A3
# M1 M2 M3 M4 M5
# M1 1 2 2 1 2
# M2 0 1 1 0 1
# M3 2 0 1 1 0
# M4 0 0 0 0 0
# M5 2 0 1 1 0
sum(A3) # 19 ← 3걸음 걷기 총 개수
sum(A2[3,] * A[,3]) # 1 ← §4
sum(A2[1,] * A[,3]) # 2 ← §5
A2[1,] * A[,3] # 2 0 0 0 0 (k=1 항이 2를 만든다)
M <- A * t(A) # 상호 지명 행렬 (아다마르 곱) ← §7-2
rowSums(M) # 2 0 1 0 1 ← m_i
diag(A2) # 2 0 1 0 1 ← 정확히 같다
all(rowSums(M) == diag(A2)) # TRUE
m <- diag(A2) # ← §7-5 헛걸음 공식
bad <- A * (outer(m, m, "+") - t(A)); diag(bad) <- 0
bad
# M1 M2 M3 M4 M5
# M1 0 2 2 0 2
# M2 0 0 1 0 0
# M3 2 0 0 1 0
# M4 0 0 0 0 0
# M5 2 0 0 0 0
A3 - bad # 대각선 밖 = 3걸음 '진짜 경로' 수 (대각선은 삼각 순환 그대로)
# M1 M2 M3 M4 M5
# M1 1 0 0 1 0
# M2 0 1 0 0 1
# M3 0 0 1 0 0
# M4 0 0 0 0 0
# M5 0 0 1 1 0 ← 연습문제를 푼 뒤 [3,4]와 [5,3] 칸을 맞춰 볼 것
diag(A3) # 1 1 1 0 0
sum(diag(A3)) / 3 # 1 ← 방향 삼각 순환 1개
S <- pmax(A, t(A)) # 대칭화(방향 무시)
sum(diag(S %*% S %*% S)) / 6 # 1 ← 무방향 삼각형 1개
여기까지는 걷기의 개수일 뿐이다. 진짜 경로를 보려면 igraph의 경로 탐색을 쓴다. 가 경로가 아니라는 §5의 주장이 이것으로 확인된다:
library(igraph)
g <- graph_from_adjacency_matrix(A, mode = "directed")
all_simple_paths(g, from = "M1", to = "M3")
# M1→M2→M3 (2걸음)
# M1→M3 (1걸음)
# ← 3걸음 단순경로는 하나도 없다. A3[1,3]=2 는 전부 재방문 걷기였다.
all_simple_paths(g, from = "M5", to = "M3")
# M5→M1→M2→M3 (3걸음) ← 연습문제 1의 답과 비교해 볼 것
# M5→M1→M3 (2걸음)
triangles(g) # M1 M3 M2 ← 방향 무시한 삼각형
count_triangles(g) # 1 1 1 0 0 ← 학생별 참여 삼각형 수
all_simple_paths()는 이름 그대로 단순경로(simple path),
즉 재방문 없는 경로만 찾는다. 행렬 거듭제곱과 결과가 다른 이유가 여기에 있다.
10. 교실 해석 (Classroom Interpretation)
① "친구의 친구의 친구"를 으로 세면 안 된다.
학급 친구관계에는 상호 지명이 많고, 상호 지명이 하나라도 끼면 은
"내 친구 → 나 → 내 친구" 같은 헛걸음을 함께 센다. 우리 예제에서도 65%가 헛걸음이었다.
3단계 관계를 보고할 일이 있으면 all_simple_paths()로 세야 한다.
② 방향 삼각 순환의 의미 — 돌아오는 소문. M1→M2, M2→M3, M3→M1은 세 지명이 모두 일방(짝사랑)인데 고리가 닫힌다. 상호 지명이 하나도 없어도 정보는 순환한다. M1이 M2에게 흘린 말이 M2→M3→M1을 돌아 자기에게 돌아온다 — "누가 퍼뜨렸는지 모르겠는데 결국 내 귀에 들어온 말"의 구조다. 상호 지명만 세는 로는 이 고리가 보이지 않는다.
③ 무방향 삼각형의 의미 — 안정된 3인 무리. 세 명이 서로 다 아는 삼각형은 관계가 닫혀 있어 잘 깨지지 않는다. 둘만의 관계는 한쪽이 멀어지면 끝나지만, 삼각형에서는 나머지 한 명이 둘을 다시 잇는다. 모둠 편성에서 삼각형을 통째로 한 조에 넣으면 안정적이지만 새 관계는 잘 생기지 않고, 쪼개 놓으면 각 조에 이미 아는 사람이 한 명씩 생긴다. 이 판단의 근거가 삼각형 목록이다. (친구의 친구가 친구가 되는 경향 = 전이성(transitivity)은 3단계에서 다룬다.)
④ M4를 어떻게 읽을 것인가. 의 M4 행은 전부 0이고 M4 열은 이다. M4는 지명을 받기만 하고 아무도 지명하지 않은 학생이다. "아무도 지명받지 못한 고립 학생"과는 다른 상황이다 — 설문에 성실히 답하지 않았거나, 관계를 밝히기를 꺼렸거나, 실제로 특정 친구를 고르지 못했을 수 있다. 숫자만으로 결론 내릴 수 없고 담임이 확인해야 하는 지점이다. 어느 쪽이든 M4는 어떤 정보 확산의 출발점도 될 수 없다는 것이 행이 0이라는 뜻이다.
⑤ 그래도 이 쓸모없는 것은 아니다. 대각선()은 언제나 정확하다 — 삼각 순환은 걷기와 경로가 일치하기 때문이다. "우리 반에 결속된 3인 고리가 몇 개인가"는 한 줄로 답할 수 있다.
11. 연습문제 (Exercises)
문제 1. 을 §4·§5처럼 다섯 항 전부 전개하시오
(, ).
살아남은 항의 걷기를 M5→?→?→M3 형태로 복원하고,
그것이 진짜 경로인지 재방문 걷기인지 판정할 것.
R 확인: sum(A2[5,] * A[,3])
문제 2. 를 같은 방식으로 전개하시오 (, ). 걷기를 복원해 경로인지 판정하고, 경로가 아니라면 어느 상호 지명 때문인지 §7-4의 표에서 어느 형태(인가 인가)에 해당하는지까지 밝힐 것.
두 문제의 행이 같은데도 결과가 갈린다는 점에 주의. 먼저 스스로 풀고 §12 해설과 맞춰 볼 것.
12. 연습문제 해설과 답 (Solutions)
12-1. 문제 1 — (A Genuine 3-Step Path)
무엇을 곱하는가. 왼쪽 의 M5 행, 오른쪽 의 M3 열:
M5→…→ 2걸음 | →M3 1걸음 | 곱 | 왜 그 값인가 | |
|---|---|---|---|---|
| 1 | 0 | 1 | 0 | M1→M3은 있지만, 2걸음으로 M1에 갈 수 없다(M5→M1은 1걸음) |
| 2 | 1 | 1 | 1 | 2걸음 M5→M1→M2 + 1걸음 M2→M3 → 연결됨 |
| 3 | 1 | 0 | 0 | 2걸음으로 M3까지는 간다(M5→M1→M3) 그러나 M3→M3이 없다 |
| 4 | 0 | 0 | 0 | 2걸음으로 M4에 못 가고, M4→M3도 없다 |
| 5 | 1 | 0 | 0 | 2걸음으로 제자리 M5에 돌아오지만(M5→M1→M5) M5→M3이 없다 |
| 합 | 1 | |||
걷기 복원. 살아남은 항 : 은 단원 1-2 §7에서 M5→M1→M2였고, 마지막 걸음 은 M2→M3이다.
답: , 걷기는 M5→M1→M2→M3 하나.
판정: 진짜 경로다. M5, M1, M2, M3 네 학생이 모두 다르고 재방문이 없다.
§9의 all_simple_paths(g, from="M5", to="M3")가 이 경로를 그대로 찾아낸 것과 일치한다.
왜 §5와 갈렸는가. 에서 함정을 만든 것은 항, 즉 "제자리로 돌아오는 2걸음"이 목적지 M3의 지명자와 겹친 것이었다. 여기서는 제자리로 돌아오는 항(, M5→M1→M5)이 있긴 하지만 M5→M3 지명이 없어서 에 막혀 죽는다. 살아남은 길은 새 사람만 밟는 뿐이었다.
12-2. 문제 2 — (A Walk That Is Not a Path)
왼쪽 의 M3 행, 오른쪽 의 M4 열:
에 1이 단 하나(M3)뿐이라는 점을 먼저 눈여겨보자. M4를 지명한 사람이 M3 한 명이므로, M4로 가는 마지막 걸음은 반드시 M3→M4다.
M3→…→ 2걸음 | →M4 1걸음 | 곱 | 왜 그 값인가 | |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 2걸음으로 M1에 못 가고, M1→M4 지명도 없다 |
| 2 | 1 | 0 | 0 | 2걸음으로 M2에 가지만(M3→M1→M2) M2→M4가 없다 |
| 3 | 1 | 1 | 1 | 2걸음 M3→M1→M3 + 1걸음 M3→M4 → 연결됨 |
| 4 | 0 | 0 | 0 | 2걸음으로 M4에 못 가고, M4→M4 자기 지명도 없다 |
| 5 | 1 | 0 | 0 | 2걸음으로 M5에 가지만(M3→M1→M5) M5→M4가 없다 |
| 합 | 1 | |||
걷기 복원. 살아남은 항이 이라는 것이 이미 경고 신호다 — 출발점도 M3, 2걸음 뒤 도착지도 M3이다. 은 단원 1-2 §8에서 "M3이 맺은 상호 지명 1건", 즉 M3→M1→M3이었다:
답: , 걷기는 M3→M1→M3→M4 하나.
판정: 경로가 아니다. M3을 두 번 지난다. M3에서 서로 다른 두 사람을 거쳐 M4에 닿는 3걸음 경로는 0개다 — M4의 유일한 지명자가 M3 자신이므로, M4에 들어가려면 반드시 M3으로 돌아와야 하고 그 순간 재방문이 확정된다.
어느 상호 지명 때문인가: M1↔M3. §7-4 표의 형태로는 유형이다 — , , 로 모양이고, 성립 조건이 바로 "와 가 상호 지명"이었다.
두 문제를 나란히 놓으면. 에서 꺼낸 행은 두 문제가 완전히 같았다 (과 이 모두 ). 결과가 갈린 것은 오른쪽 열이 어느 항을 살렸는가 때문이다:
| 문제 | 살아남은 | 그 항의 2걸음 조각 | 재방문 | 판정 |
|---|---|---|---|---|
| 1: | M5→M1→M2 — 새 사람만 | 없음 | 경로 | |
| 2: | M3→M1→M3 — 제자리로 복귀 | M3 두 번 | 걷기만 |
손으로 판정하는 요령. 살아남은 항의 가 출발점 와 같거나, 도착점 와 같으면 그 항은 재방문 걷기다. 면 "제자리로 돌아왔다 다시 출발", 면 "목적지를 밟았다 나갔다 다시 들어옴"이다. 문제 2는 였고, §5의 함정은 였다. 전개 표에서 열만 봐도 의심할 수 있다.
sum(A2[5,] * A[,3]) # 1 ← 문제 1
A2[5,] * A[,3] # 0 1 0 0 0 (k=2 항만 살아남음)
sum(A2[3,] * A[,4]) # 1 ← 문제 2
A2[3,] * A[,4] # 0 0 1 0 0 (k=3 항 = 출발점과 같다 → 재방문 신호)
# 경로만 세어 교차 검증
length(all_simple_paths(g, from="M5", to="M3")) # 2개 (2걸음·3걸음)
length(all_simple_paths(g, from="M3", to="M4")) # 1개 (M3→M4, 1걸음뿐)
이제 §6 표의 빈칸이 채워졌다. 3걸음 걷기 19개 중 진짜 경로는 4개(, , , ), 삼각 순환 3개(같은 삼각형 1개를 세 번 센 것), 나머지 12개가 재방문 걷기다.
다음 단원 — 1-4: 연결정도(degree) — 행합·열합 공식과 평균 연결정도.
행렬을 곱하는 대신 더하는 지표로 넘어간다. 에서 잠깐 봤던
"M4의 행이 전부 0"이 연결정도 언어로는 외향 연결정도 0이라는 한 마디가 된다.
· 이 문서: notes/03_단원1-3_A3_걷기vs경로_삼각순환.html