<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>레프네 약방</title>
    <link>https://drugstoreoftamref.tistory.com/</link>
    <description>졸업하고 싶다</description>
    <language>ko</language>
    <pubDate>Sun, 7 Jun 2026 14:49:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>탐렢</managingEditor>
    <image>
      <title>레프네 약방</title>
      <url>https://tistory1.daumcdn.net/tistory/2319052/attach/dc29b4c1a3384dab90f795a4fbfb069a</url>
      <link>https://drugstoreoftamref.tistory.com</link>
    </image>
    <item>
      <title>Counting Eulerian Circuits of a Graph</title>
      <link>https://drugstoreoftamref.tistory.com/163</link>
      <description>&lt;p&gt;이 글은 GPT 5가 최종 편집하였다. 썸네일도 마찬가지인데, 예전보다는 좀 발전한 것 같다.&lt;/p&gt;
&lt;p&gt;그래프에 Euler Circuit이 존재할 조건은 방향그래프, 무방향그래프에서 모두 쉽게 판정할 수 있다. 그렇다면 가능한 Eulerian Circuit의 개수는 몇 개일까? 신기하게도, 이 경우에 대한 답은 방향그래프에서 훨씬 쉽다는 것이 알려져 있다.&lt;/p&gt;
&lt;h1&gt;Directed Graph : BEST theorem&lt;/h1&gt;
&lt;p&gt;결론부터 말해, 방향그래프의 오일러 투어 개수는 $O(n^3)$ (혹은 $O(n^\omega)$) 시간 안에 구할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;BEST&amp;quot; Theorem&lt;/strong&gt;: 방향그래프 $G$의 Eulerian Circuit 개수를 $\mathrm{ec}(G)$라 하고, 고정된 $w \in V(G)$에 대해 $w$를 루트로 하는 arborescence($w$를 루트로 하고, 무방향 그래프로 보면 트리이며 간선은 부모에서 자식으로 향하는 spanning subgraph)의 개수를 $t_{w}(G)$라 하자. 그러면 다음이 성립한다.&lt;/p&gt;
&lt;p&gt;$\mathrm{ec}(G) = t_{w}(G) \prod_{v \in V} (\deg(v) - 1)!$&lt;/p&gt;
&lt;p&gt;여기서 $\deg(v)$는 그래프가 Eulerian이므로 outdeg와 indeg가 같으니 그냥 $\deg(v)$로 쓸 수 있다.&lt;/p&gt;
&lt;p&gt;$t_{w}(G)$는 Laplacian의 entry를 방향그래프에 맞게 정의한다. 즉, $i \to j$ 간선이 있으면 $L_{ij} = -1$, $L_{ji} = 1$로 두고, diagonal entry는 $i$의 (loop를 제외한) indegree로 둔다. 이후 무방향그래프의 matrix-tree theorem처럼 determinant를 계산한다. 이제 각 arborescence와 Eulerian circuit이 정확히 $\prod_{v} (\deg(v) - 1)!$-대-1로 대응됨을 보이면 된다. $w$에서 Eulerian circuit을 따라가며 DFS 트리를 구성할 수 있고, 두 트리가 같아지는 경우는 서브트리의 탐색 순서를 조정하는 $(\deg(v) - 1)!$가지 경우뿐이다. 루트 $w$에서는 $\deg(w)!$이라고 생각할 수 있지만, circuit이므로 첫 방문 서브트리를 고정해야 한다.&lt;/p&gt;
&lt;p&gt;참고로, SNUPC 2025에 이 정리를 활용해 풀 수 있는 &lt;a href=&quot;https://www.acmicpc.net/problem/34345&quot;&gt;문제&lt;/a&gt;가 출제되었다.&lt;/p&gt;
&lt;h1&gt;Undirected Graph : #P-complete&lt;/h1&gt;
&lt;p&gt;#P-complete 문제는 counting 문제에서 중요한 hardness class이다. 가장 쉬운 예로 3-SAT(혹은 일반적인 SAT)의 해 개수를 세는 #SAT 문제가 있다. 관련해 &lt;a href=&quot;https://infossm.github.io/blog/2022/11/08/toposort/&quot;&gt;이 글&lt;/a&gt;에 몇 가지 예시를 정리해 두었다.&lt;/p&gt;
&lt;p&gt;잘 알려져 있고, 유용하지만 증명은 복잡해 잘 쓰이지 않는 정리로는 Valiant (1979)의 &amp;quot;이분그래프의 perfect matching 개수를 세는 문제는 #P-complete이다&amp;quot;가 있다.&lt;/p&gt;
&lt;p&gt;다음 단계로 무방향 그래프의 Euler Circuit 개수를 세는 문제를 Perfect Matching 개수 문제로 환원할 수 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;#Bipartite Perfect Matchings $\Rightarrow$ #Eulerian Orientation (Mihail &amp;amp; Winkler, 1992)&lt;/li&gt;
&lt;li&gt;#Eulerian Orientation $\Rightarrow$ #Orbs $\Rightarrow$ #Euler Circuits (Brightwell &amp;amp; Winkler, 2004)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 1. Matching to Eulerian Orientations&lt;/h2&gt;
&lt;p&gt;모든 그래프는 parallel edge를 허용하는 multigraph로 가정한다.&lt;/p&gt;
&lt;p&gt;무방향 이분그래프 $G = (A \sqcup B, E)$가 주어졌다고 하자. $n := \lvert A \rvert = \lvert B \rvert$, $m := \lvert E \rvert$라 두자. source와 sink에 해당하는 정점 $s, t$를 추가해, 각 $a \in A$에 대해 $(s, a)$ 간선을 $\deg(a) - 2$개, 각 $b \in B$에 대해 $(b, t)$ 간선을 $\deg(b) - 2$개 추가한 그래프 $G&amp;#39;$를 만든다. $G$에서 차수가 1인 정점은 유일한 매칭 정점이 대응되므로 처음부터 제거해도 매칭 개수에는 영향이 없다. 따라서 $\deg(a) \ge 2, \deg(b) \ge 2$라고 가정할 수 있다.&lt;/p&gt;
&lt;p&gt;이제 $X_j$를 $G&amp;#39;$의 orientation 중에서 $A, B$의 indeg = outdeg 조건을 만족하고, $s$의 indeg - outdeg가 $j$인 것의 개수라고 하자. 즉, $(s, t)$ 꼴의 directed edge를 $j$개 추가하면 Eulerian이 되는 orientation의 개수이다. (단, $j &amp;lt; 0$이면 $(t, s)$를 $\lvert j \rvert$개 추가해야 한다.)&lt;/p&gt;
&lt;p&gt;이때 $X_{m - 2n}$은 정확히 $G$의 perfect matching 개수와 같다. $s$로 $m - 2n$개의 간선이 모두 향한다는 것은 각 $a \in A$에 대해 $\deg(a) - 2$개의 간선이 전부 $s$로 향한다는 뜻이다. 따라서 $E$의 간선 중 단 하나만 $a$에서 나갈 수 있다. 마찬가지로 각 $b \in B$에서는 단 하나의 간선만 들어올 수 있다. 결국 $A \times B$ 부분만 보면 perfect matching과 일대일 대응한다.&lt;/p&gt;
&lt;p&gt;그렇다면 $m - 2n$개의 $(s, t)$ 방향 간선을 이어 orientation의 개수를 세면 되지 않을까? 하지만 방향 + 무방향 혼합 그래프의 orientation 개수를 세는 것은 우리가 다룰 수 있는 범위가 아니다. 무방향 간선을 추가하면 그 중 일부는 $(s, t)$, 일부는 $(t, s)$로 orient될 수 있기 때문이다. 정확히 말해, $G&amp;#39;$에 $(s, t)$ 무방향 간선을 $k$개 추가한 그래프를 $G_k$, 그리고 $G_k$의 Eulerian orientation 개수를 $\mathcal{O}(G_k)$라 하면 다음이 성립한다.&lt;/p&gt;
&lt;p&gt;$\mathcal{O}(G_{k}) = \sum_{j=0}^{k} \binom{k}{j} X_{j-(k-j)}$&lt;/p&gt;
&lt;p&gt;따라서 $\mathcal{O}(G_{m \bmod 2}), \dots, \mathcal{O}(G_{m - 2n})$을 계산하면 $X_{m - 2n}$을 구할 수 있다. 식의 개수는 $\lvert (m - 2n) / 2 \rvert$개이고 변수 개수도 동일하다. ($X_{-k} = X_{k}$이기 때문.) 연립 방정식을 풀면 $X_{m - 2n}$을 계산할 수 있으므로, $\mathcal{O}(\cdot)$를 $O(m)$번 호출해 bipartite perfect matching을 구할 수 있다. 따라서 Eulerian Orientation 개수를 세는 것은 #P-complete이다.&lt;/p&gt;
&lt;h2&gt;Step 2. Eulerian Orientation to Orbs and Circuits&lt;/h2&gt;
&lt;p&gt;#P-completeness를 보일 때 자주 쓰이는 기법은 임의의 홀수 소수 $p$에 대해 경우의 수를 mod $p$로 세는 것이 어렵다는 것을 보이는 것이다. 경우의 수가 $2^{\mathrm{poly}(n)}$ 스케일이므로 충분히 많은 서로 다른 $p$에 대해 construction을 반복하면 CRT로 원래 값을 복원할 수 있다.&lt;/p&gt;
&lt;p&gt;무방향 그래프 $G$의 Orb는, 고정된 $r \in V(G)$에 대해 $G$의 eulerian orientation $\vec{G}$와 $r$을 루트로 하는 arborescence $T$의 pair $(\vec{G}, T)$를 말한다. BEST theorem에 의해 orb와 circuit 개수는 $\prod_{v \in V} (\deg(v) - 1)!$-대-1 대응이 있으므로, Orb 개수를 세는 것이 어렵다는 것만 보이면 된다. 역시 그래프는 multigraph라 가정한다.&lt;/p&gt;
&lt;p&gt;홀수 소수 $p$를 고정하고, $G$의 각 간선을 $p$개의 parallel edge로 대체한다. 그리고 새로운 루트 정점 $r$을 추가해 각 정점과 $r$을 두 개의 parallel edge로 연결한다. 이렇게 만든 그래프를 $G_p$라 하자. $G_p$의 orb 수와 $G$의 eulerian orientation 수 사이에 mod $p$ 관계가 있음을 보이면 된다.&lt;/p&gt;
&lt;p&gt;$G_p$의 orb 중에서 각 간선이 $p$개 모두 같은 방향이고, 트리에는 $(r, v)$ 꼴 간선만 사용된다면 이를 special orb라 하자. indeg - outdeg 조건을 mod $p$로 보면, 나머지 한 간선은 $(v, r)$ 형태로 orient되어야 한다. 따라서 $(r, v)$, $(v, r)$을 제거하면 이는 $G$의 eulerian orientation과 정확히 대응한다. 즉, $G$의 eulerian orientation이 $N$가지라면 special orb는 $2^{n} N$가지이다.&lt;/p&gt;
&lt;p&gt;그렇지 않은 경우는 다음과 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;어떤 간선 $e \in E(G)$가 있어 $0 &amp;lt; k &amp;lt; p$개만 $G_p$에서 같은 방향으로 orient된 경우&lt;br&gt;a. $e$의 복사본 중 하나가 arborescence에 포함된 경우&lt;br&gt;b. 포함되지 않은 경우&lt;/li&gt;
&lt;li&gt;어떤 간선 $e \in E(G)$가 있어 $p$개 모두 같은 방향이고, 트리에도 사용된 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Case 1a에서는 방향을 결정하고 트리에 포함될 간선을 고르면 $k \binom{p}{k}$ 또는 $(p-k)\binom{p}{k}$개의 isomorphic orb가 생긴다.&lt;br&gt;Case 1b에서도 비슷하게 $\binom{p}{k}$개의 isomorphic orb가 존재한다.&lt;br&gt;Case 2에서는 트리에 포함될 간선을 고르는 $p$개의 isomorphic orb가 생긴다.&lt;/p&gt;
&lt;p&gt;이 경우들은 겹치지 않으므로 non-special orb의 개수는 $p$의 배수이다. 따라서 $G_p$의 orb 개수는 $2^n N \pmod{p}$이고, 이로부터 $N \pmod{p}$를 구할 수 있다.&lt;/p&gt;</description>
      <category>CS 이론/알고리즘</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/163</guid>
      <comments>https://drugstoreoftamref.tistory.com/163#entry163comment</comments>
      <pubDate>Mon, 15 Sep 2025 09:31:50 +0900</pubDate>
    </item>
    <item>
      <title>Node Ranking of Trees</title>
      <link>https://drugstoreoftamref.tistory.com/162</link>
      <description>&lt;p&gt;이 글은 GPT 4.5가 최종 편집하였다. 썸네일 역시 GPT로 생성했지만, 본문의 내용과는 아무 관련이 없다.&lt;/p&gt;
&lt;p&gt;그래프의 &lt;strong&gt;Vertex Ranking&lt;/strong&gt;은 다음 조건을 만족하는 labeling $\rho : V \to \mathbb{Z}_{\ge 1}$로 정의된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;서로 다른 두 정점 $u, v$에 대해서 $\rho(u) = \rho(v)$라면, 이들을 연결하는 모든 경로상에 항상 $\rho(x) &amp;gt; \rho(u)$를 만족하는 정점 $x$가 존재해야 한다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;이때 $\rho(v)$의 최댓값을 &lt;strong&gt;vertex ranking number&lt;/strong&gt; 또는 &lt;strong&gt;vertex ranking chromatic number&lt;/strong&gt; $\chi_{vr}(G)$라고 부른다. 당연히 일반적인 chromatic number보다는 크거나 같다. 트리에 대해서는 비교적 간단한 알고리즘이 알려져 있지만, 일반 그래프에서는 Hitting Set Problem과 관련 있다는 사실만 알려져 있다. 이 글에서는 트리의 vertex ranking을 구하는 $O(n)$ 알고리즘을 소개한다.&lt;/p&gt;
&lt;p&gt;이 문제는 &lt;a href=&quot;https://www.acmicpc.net/problem/1868&quot;&gt;BOJ 1868번 문제&lt;/a&gt;를 통해 직접 채점할 수 있다. 문제의 설명을 통해 vertex ranking이 트리의 search query complexity와 관련된다는 점을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;우선 Centroid Decomposition이 항상 유효한 vertex ranking을 제공하므로, 항상 $\chi_{vr}(T) \le \log_{1.5} n$이 성립한다. 이 점을 염두에 두고 최적의 ranking을 유도해보자. 편의상 $\rho(v)$를 &amp;quot;&lt;strong&gt;$v$의 rank&lt;/strong&gt;&amp;quot;라고 부르자. 트리 DP를 이용해서 각 정점 $v$의 서브트리들에서 같은 rank를 가진 정점들이 연결되지 않도록 $\rho(v)$를 정해주고자 한다. (Base case는 정점이 하나뿐인 경우이며, 이때는 $\rho(v)=1$로 설정하면 된다.)&lt;/p&gt;
&lt;p&gt;귀납적으로 $v$의 각 서브트리는 이미 올바르게 ranking되었다고 가정하자. 여기서 중요한 정점들은 서브트리 내에서 &amp;quot;&lt;strong&gt;local max&lt;/strong&gt;&amp;quot;가 되는 정점들이다. 즉, 루트 $v$까지 올라오는 경로에 자기보다 높은 rank의 조상이 없는 정점들을 의미한다. 정의상 이런 정점들은 rank마다 최대 하나씩 존재할 수 있으므로, 서브트리마다 local max는 최대 $O(\log n)$개 존재한다.&lt;/p&gt;
&lt;p&gt;다음의 간단한 관찰을 할 수 있다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;어떤 rank $r$이 두 개 이상의 서브트리에서 등장하면, 반드시 $\rho(v) &amp;gt; r$이어야 한다. 그렇지 않으면 두 local max가 연결되기 때문이다.&lt;/li&gt;
&lt;li&gt;또한 $\rho(v)$는 서브트리의 local max들 중에 없는 값이어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 두 가지 관찰을 이용해 $\rho(v)$를 다음과 같이 그리디하게 결정하자.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;서브트리의 모든 local max 중에서 등장하지 않으면서, 자기보다 큰 값이 최대 한 번만 등장하는 최소의 값 $q$.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;놀랍게도, 이 방식이 최적의 ranking을 준다. 서브트리의 기존 labeling을 수정할 필요도 없다. 이렇게 $\rho(v)$를 정한 뒤에는 local max들 중에서 값이 $q$보다 큰 정점들만 유지하여 위로 전달하면 된다.&lt;/p&gt;
&lt;p&gt;위 알고리즘을 그대로 구현하면 $O(n \log n)$에 동작하고, 조금 더 효율적인 자료구조를 활용하면 $O(n)$에도 동작한다. (&lt;a href=&quot;https://cubelover.tistory.com/31&quot;&gt;이 글&lt;/a&gt;에 유사한 아이디어가 잘 정리되어 있다.) 각 정점에서 서브트리들을 합칠 때 rank는 최대 1씩 증가하므로, 두 번씩 등장하는 최댓값을 찾는 과정을 &lt;strong&gt;최대가 아닌&lt;/strong&gt; 서브트리의 rank 합만큼의 시간 내에 처리하면 $O(n)$을 증명할 수 있다.&lt;/p&gt;
&lt;p&gt;이제 우리가 위에서 그리디하게 정한 labeling $\rho$가 최적임을 증명하자.&lt;/p&gt;
&lt;p&gt;일단 유효한 $\rho$라면, rank가 최대인 정점은 정확히 하나만 존재할 수 있다. 두 개 이상 존재한다면, 그 정점들은 반드시 자기보다 낮은 rank의 정점들로만 연결되기 때문에 모순이다.&lt;/p&gt;
&lt;p&gt;이제 $\chi_{vr}(T)$에 대한 귀납법을 사용하자. Base case로 $\chi_{vr}(T)=1$인 경우는 자명히 정점이 하나뿐이며 우리의 그리디한 방식으로 정한 $\rho$가 최적이다.&lt;/p&gt;
&lt;p&gt;$\chi_{vr}(T) &amp;gt; 1$인 경우, 앞서 언급했듯이 우리가 정한 $\rho$에 대해 rank가 최대인 정점 $w$의 서브트리 $T_w$를 제거하자. 귀납 가정에 따라, 트리 $T - T_w$는 우리가 제안한 그리디 방식으로 항상 최적의 ranking이 결정된다. 이 값은 반드시 $\chi_{vr}(T - T_w) \le \chi_{vr}(T)$를 만족하므로, 서브트리 $T_w$의 존재 여부는 다른 정점들의 rank 결정 과정에 전혀 영향을 주지 않는다.&lt;/p&gt;
&lt;p&gt;$\rho(w)=\chi_{vr}(T)$였다는 것은 $\rho(w)$ 미만의 값들이 반복해서 등장한다는 의미다. 두 번 이상 등장하는 가장 큰 값을 $p$라 하자. (그런 값이 없다면 $p=0$이라 하면 된다.) 그러면 rank 구간 $[p+1, \rho(w)-1]$의 각 값이 local max로 정확히 한 번씩 등장한다.&lt;/p&gt;
&lt;p&gt;이제 rank 구간 $[p, \rho(w)-1]$ 각각의 local max를 포함하는 서브트리를 생각해 보자. 이들은 서로소거나 포함 관계로 이루어진 &lt;strong&gt;laminar set&lt;/strong&gt; 구조를 가진다. 만약 포함 관계를 이루는 두 서브트리 $T \subseteq T&amp;#39;$가 있다면 $T&amp;#39; - T$를 고려하여 서로소로 만들 수 있다.&lt;/p&gt;
&lt;p&gt;귀납 가정에 따라, 이렇게 얻은 각 서로소 서브트리를 labeling하려면 반드시 대응되는 local max 값만큼의 label이 필요하다. (서로소로 만들기 전) 서브트리들이 서로 포함하는 경우에는 약간 더 엄밀하게 따져 줘야 하지만, $T_w$가 위 서브트리에 영향을 주지 않는 이유와 비슷하다. 따라서 임의의 다른 ranking $\rho&amp;#39;$을 사용하더라도, 이 서브트리들은 rank 구간 $[p+1, \rho(w)-1]$의 local max를 각각 한 번씩 만들어야 하고, ($p &amp;gt; 0$이라면) rank $p$인 local max를 두 번 만들어야 한다. 그러므로 당연히 $\rho&amp;#39;(w) \ge \rho(w)$이어야 한다. 증명 끝.&lt;/p&gt;</description>
      <category>CS 이론/알고리즘</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/162</guid>
      <comments>https://drugstoreoftamref.tistory.com/162#entry162comment</comments>
      <pubDate>Mon, 12 May 2025 17:19:47 +0900</pubDate>
    </item>
    <item>
      <title>접미사 배열의 조합적 성질</title>
      <link>https://drugstoreoftamref.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이 글은 GPT-4.5가 최종 편집하였다. 썸네일의 suffix array도 GPT가 그렸지만, 아쉽게도 틀렸다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 $n$인 문자열 $S$의 접미사 배열(Suffix Array, SA)이란, $S$의 모든 접미사(suffix) $S[i\dots]$들을 사전 순으로 정렬했을 때의 시작 인덱스 순열을 말한다. 예를 들어, $S = aba$라면 접미사들을 사전 순으로 정렬했을 때 $a &amp;lt; aba &amp;lt; ba$이므로, 접미사 배열은 0-based로 $[0, 2, 1]$이 된다. SA는 문자열 알고리즘에서 매우 중요한 자료구조로, 기본 개념에 대해서는 &lt;a href=&quot;https://koosaga.com/125&quot;&gt;koosaga님의 글&lt;/a&gt;을 참고하면 좋다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Inverse Problem&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 순열 $\sigma$가 주어졌을 때, 이를 접미사 배열로 하는 문자열은 몇 개나 존재할까? SA는 $S[\sigma(0)] \le \dots \le S[\sigma(n-1)]$라는 관계를 나타내므로, 우리는 이 등호가 언제 성립하지 않는지만 판별하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 $S[\sigma(i)] = S[\sigma(i+1)]$이라면, $S[\sigma(i)+1\dots] &amp;lt; S[\sigma(i+1)+1\dots]$여야 한다. 이 정보는 순열 $\sigma$ 자체에 이미 포함되어 있다. 즉, $\sigma^{-1}(\sigma(i)+1) &amp;lt; \sigma^{-1}(\sigma(i+1)+1)$을 확인하면 된다. (단, $\sigma^{-1}(n) = -1$로 정의한다.) 전체 문자 종류가 $m$개이고, 이러한 $i$의 개수가 $r$개라면 가능한 문자열 $S$의 개수는 다음과 같다: $\binom{m+r}{n}$&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연습 문제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13012&quot;&gt;BOJ 13012. 접미사 배열 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13013&quot;&gt;BOJ 13013. 접미사 배열 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13924&quot;&gt;BOJ 13924. 접미사 배열 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Counting Problem&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로, 문자의 종류가 최대 $m \le n$개인 길이 $n$의 문자열이 가질 수 있는 접미사 배열의 총 가짓수 $SA(m, n)$는 얼마일까? 우선 다음 사실을 관찰할 수 있다:&lt;br /&gt;$$\sigma^{-1}(\sigma(i)+1)&amp;gt;\sigma^{-1}(\sigma(i+1)+1) \implies S[\sigma(i)] &amp;lt; S[\sigma(i+1)]$$&lt;br /&gt;이 조건을 만족하는 $i$는 최대 $m-1$개 존재할 수 있다. 여기서 $\tau(i) := \sigma^{-1}(\sigma(i)+1)$는 사실상 ${0, \dots, n-1}$에서 ${-1, \dots, n-1}$로 가는 injective 함수이며, image에서는 정확히 $\sigma(0)$만 빠져있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예컨대, $\sigma = \begin{pmatrix}0 &amp;amp; 1 &amp;amp; 2 \\ 1 &amp;amp; 0 &amp;amp; 2\end{pmatrix}$이라면 $\tau = \begin{pmatrix}0 &amp;amp; 1 &amp;amp; 2 \\ 2 &amp;amp; 0 &amp;amp; -1\end{pmatrix}$가 된다. 여기서 $\sigma(0)$보다 작은 값들에 1을 더하여 새로운 순열 $\tau'$를 만들 수 있으며, 이렇게 정의한 변환 $f : S_n \to S_n$, $f(\sigma) = \tau'$는 bijection이다. 편의상 $f(\sigma)$를 $\tilde{\sigma}$로 쓰자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 원래 문제는 $\tilde{\sigma}(i) &amp;gt; \tilde{\sigma}(i+1)$인 i의 개수(descent)가 최대 $m-1$개인 순열의 개수를 세는 문제로 환원된다. 역으로, descent가 $m-1$개 이하라면 descent를 기준으로 구간을 나누고 각 구간에 문자를 배정하는 방식으로 SA를 구성할 수 있다. 순열에서 정확히 $k$개의 descent를 가지는 순열의 수를 나타내는 Eulerian Number $A(n, k)$를 사용하면, 우리가 원하는 해답은 다음과 같이 표현할 수 있다: $$SA(m, n) = \sum_{i=0}^{m-1} A(n, i)$$&lt;br /&gt;Eulerian Number는 생성함수를 이용해 $O(n \log n)$ 시간 내로 계산할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연습 문제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11393&quot;&gt;BOJ 11393. 접미사 배열의 개수&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Worpitzky's Identity&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 가지 관찰을 결합하면 유명한 Worpitzky의 항등식을 증명할 수 있다: $$x^{n} = \sum_{k=0}^{n-1} A(n, k) \binom{x+k}{n}$$&lt;br /&gt;이는 Eulerian Number가 다항식 기저 변환과 유사한 구조를 가짐을 보여준다(&lt;a href=&quot;https://tamref.com/133&quot;&gt;예전 글 참고&lt;/a&gt;). 여기서 $\binom{x+k}{n}$가 반드시 다항식의 기저를 이루는 것은 아니지만 꽤 재미 있는 해석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증명 아이디어는 간단하다. descent가 $r$개인 순열의 개수가 $A(n, r)$이며, 각 순열에 대해 가능한 문자열 개수가 $\binom{m+r}{n}$이므로, 모든 양의 정수 $m$에 대해 $$m^{n} = \sum_{k=0}^{n-1} A(n,r ) \binom{m+r}{n}$$&lt;br /&gt;가 성립하고, 이는 다항식의 항등식을 의미한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;With LCP Array (TBD)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접미사 배열만으로는 문자열을 유일하게 복원할 수 없지만, LCP(Longest Common Prefix) 배열까지 주어지면 복원이 가능해진다. LCP 배열에서 값이 0인 위치가 문자가 바뀌는 지점이 된다. &lt;a href=&quot;https://arxiv.org/pdf/1606.04573&quot;&gt;이 논문&lt;/a&gt;에 따르면, SA 없이 LCP 배열만 주어진 경우 특정 조건 하에 polynomial time으로 문자열 복원이 가능하지만, LCP 배열의 유효성(validity) 검증 문제는 NP-complete이다.&lt;/p&gt;</description>
      <category>CS 이론/자료구조</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/161</guid>
      <comments>https://drugstoreoftamref.tistory.com/161#entry161comment</comments>
      <pubDate>Thu, 8 May 2025 11:47:19 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 18763 Knowledge oriented problem</title>
      <link>https://drugstoreoftamref.tistory.com/160</link>
      <description>&lt;h1&gt;Problem statement&lt;/h1&gt;
&lt;p&gt;정점 $n$개인 무방향 그래프 $G$가 주어진다. 정점이 $k$개인 path $P_k$와의 &lt;a href=&quot;https://en.wikipedia.org/wiki/Cartesian_product_of_graphs&quot;&gt;cartesian product&lt;/a&gt; $G \square P_{k}$의 cartesian product의 스패닝 트리의 개수를 구하여라. $n \le 500$, $k \le 10^{18}$.&lt;/p&gt;
&lt;h1&gt;Matrix-tree theorem&lt;/h1&gt;
&lt;p&gt;그래프 $G$의 &lt;a href=&quot;https://en.wikipedia.org/wiki/Laplacian_matrix&quot;&gt;Laplacian&lt;/a&gt; 을 $L_{G} := D_{G} - A_{G}$로 쓰자. $L_{G}$는 real symmetric matrix이고, positive semidefinite이므로 양의 실수 고윳값을 갖는다. Connected graph $G$에 대해 $L_{G}$는 rank $n-1$이 되는데, non-zero eigenvalue를 $\lambda_{1} \ge \cdots \ge \lambda_{n-1} &amp;gt; 0 = \lambda_{n}$이라고 두면, $G$의 스패닝 트리는 $$t(G) = \frac{1}{n}\lambda_{1} \cdots \lambda_{n-1}$$&lt;br&gt;개가 존재한다.&lt;/p&gt;
&lt;h1&gt;Laplacians of Cartesian products&lt;/h1&gt;
&lt;p&gt;두 그래프 $G, H$의 cartesian product $G \square H$의 Laplacian은 tensor product $$L_{G \square H} = L_{G} \otimes I + I \otimes L_{H}$$와 같이 나타난다. degree 행렬과 adjacency 행렬을 계산해보면 동일한 관계식을 알 수 있다. 두 행렬 $A, B$의 tensor product는 $$(A \otimes B) _ {ii&amp;#39;, jj&amp;#39;} = A_{ij}B_{i&amp;#39;j&amp;#39;}$$&lt;br&gt;와 같이 정의된다.&lt;/p&gt;
&lt;p&gt;$L_{G \square H}$의 eigenvector는 역시 각각의 eigenvector의 tensor product로 나타나는데, 고윳값이 $\lambda_{i}$인 $G$의 eigenvector $v_{i}$와 고윳값이 $\mu_{j}$인 $H$의 eigenvector $w_{j}$에 대해 $v_{i} \otimes w_{j}$가 고윳값 $\lambda_{i} + \mu_{j}$를 가진다는 걸 확인할 수 있다. 이제 우리가 계산할 건 $H = P_{k}$로 주어졌을 때&lt;br&gt;$$\frac{1}{nk}\prod_{(i, j) \neq (n, k)} (\lambda_{i} + \mu_{j})$$&lt;/p&gt;
&lt;p&gt;를 계산하면 된다.&lt;/p&gt;
&lt;h1&gt;Laplacian polynomials&lt;/h1&gt;
&lt;p&gt;$lambda_{i}$를 정확하게 계산할 수도 없고, $O(nk)$개를 곱할 능력은 더 없다. 하지만 $L_{P_k}$의 characteristic polynomial $\phi_{k}(x) = (x - \mu_{1}) \cdots (x - \mu_{n-1})(x - \mu_{n})$를 계산할 수 있으면 $\phi_{k}(-\lambda_{i})$ 가 구하고자 하는 식에 나타나는 듯 보인다. 우선 $\phi_{k}(x)$에 주목하자.&lt;/p&gt;
&lt;p&gt;$L_{P_k}$가 trilinear하다는 성질에서부터, 다음과 같은 점화식을 유도할 수 있다.&lt;br&gt;$$\phi_{0}(x)=0,\phi_{1}(x)=x,\quad\phi_{k}(x)=(x-2)\phi_{k-1}(x)-\phi_{k-2}(x)$$&lt;br&gt;이로부터 $\mu_{j}$의 값도 Chebyshev&amp;#39;s polynomial과 엮어서 닫힌 형태로 쓸 수 있는데, 이 문제를 푸는 데 별 도움은 안 된다.&lt;/p&gt;
&lt;p&gt;편의에 따라 $Q_{k}(x) = (-1)^{k}\phi_{k}(-x)/x$를 계산하기로 하자. 점화식은 다음과 같다.&lt;br&gt;$$Q_{0}(x)=0, Q_{1}(x)=1,\quad Q_{k}(x)=(x+2)Q_{k-1}(x) - Q_{k-2}(x)$$&lt;/p&gt;
&lt;p&gt;일단 $Q_{k}(x) \bmod x^{n}$ 같은 걸 구하고 싶다면 $O(n \log n \log k)$ 정도에 구할 수 있는 식이 생긴 셈이다.&lt;/p&gt;
&lt;h1&gt;$O(n^3 \log k)$ 풀이 (TLE)&lt;/h1&gt;
&lt;p&gt;이제 우리가 원하는 식을 다시 $Q_{k}$를 이용하여 나타내면 다음과 같다.&lt;br&gt;$$\frac{1}{nk}\prod_{i=1}^{n-1} Q_{k}(\lambda_{i}) \cdot (\lambda_{1}\cdots\lambda_{n-1}) \cdot (\mu_{1}\cdots\mu_{k-1})$$&lt;br&gt;$G, H$의 nonzero eigenvalue를 묶은 $(n-1)(k-1)$개의 고윳값이 $Q_{k}$를 이용하여 묶였고, zero eigenvalue와 관련된 나머지 항들이 뒤따른다. 그런데 사실 위의 matrix tree theorem을 생각하면, 이 항들을 다시&lt;br&gt;$$\prod_{i=1}^{n-1} Q_{k}(\lambda_{i})t(G)t(P_{k})$$&lt;br&gt;로 정리할 수 있다. $t(G)$는 계산하기 어렵지 않고, $t(P_{k})=1$이니 결국 맨 처음 항이 문제다.&lt;/p&gt;
&lt;p&gt;$L_{G}$는 real symmetric matrix니까 diagonalizable하다. $L_{G} = P\Lambda P^{T}$로 쓰자. $\Lambda = \mathrm{diag}(\lambda_{1}, \cdots, \lambda_{n})$으로 생각한다. 그러면 $Q_{k}(L_{G}) = PQ_{k}(\Lambda)P^{T}$가 되는 걸 확인할 수 있다. 이 때 $Q_{k}(\Lambda) = \mathrm{diag}(Q_{k}(\lambda_{1}), \cdots, Q_{k}(\lambda_{n}))$이다. 그러면 $Q_{k}(L_{G})$의 characteristic polynomial을 알면 $Q_{k}(\lambda_{1}) \cdots Q_{k}(\lambda_{n-1})$을 어렵지 않게 계산할 수 있다. $Q_{k}(0)=k$가 $10^{9}+7$의 배수인지 여부에 따른 subtle함이 있지만 크게 문제는 아니다.&lt;/p&gt;
&lt;p&gt;$Q_{k}(L_{G}) = (L_{G} + 2I)Q_{k-1}(L_{G}) - Q_{k-2}(L_{G})$&lt;/p&gt;
&lt;p&gt;를 이용해서 $O(n^{3} \log k)$에 계산하려고 하면, 당연히 TLE를 받는다.&lt;/p&gt;
&lt;h1&gt;Resultant&lt;/h1&gt;
&lt;p&gt;사실, 두 다항식의 스펙트럼에 관련된 잘 알려진 값이 존재한다. $f(x)=a(x-\lambda_{1})\cdots(x-\lambda_{d}), g(x)=b(x-\mu_{1})\cdots(x-\mu_{e})$에 대해, 그 둘의 resultant는 $$\mathrm{Res}(f, g) = a^{e}b^{d}\prod_{i,j} (\lambda_{i} - \mu_{j})$$로 정의한다.&lt;/p&gt;
&lt;p&gt;사실 대수적으로 닫힌 체가 아니더라도 Resultant는 &lt;a href=&quot;https://en.m.wikipedia.org/wiki/Sylvester_matrix&quot;&gt;Sylvester Matrix&lt;/a&gt;의 determinant - 즉 계수들에 대한 식으로 표현할 수 있고, 근으로 쪼개지는 경우 위의 식과 정확히 일치한다. 다음은 우리가 활용할 Resultant의 몇 가지 성질들이다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mathrm{Res}(c, g) = c^{\deg g}$, $\mathrm{Res}(f, c) = c^{\deg f}$&lt;/li&gt;
&lt;li&gt;$\mathrm{Res}(f, g) = (-1)^{\deg f\deg g}\mathrm{Res}(g, f)$&lt;/li&gt;
&lt;li&gt;$g = fq + r$이라고 할 때, $\mathrm{Res}(f, g) = \mathrm{Res}(r, g) \cdot f_{0}^{\deg g - \deg r}$. 여기서 $f_{0}$는 $f$의 최고차항 계수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그래서 결국 유클리드 호제법을 통해 $\mathrm{Res}(f, g)$를 subcubic time에 계산할 수 있다. $L_{G}$의 Characteristic polynomial $\psi(x)$에 대해, $\mathrm{Res}(\psi, Q_{k})$를 계산하자. $Q_{k}$는 너무 크니 $Q_{k}(x) \bmod \psi(x)$를 점화식을 통해 계산해주면 된다.&lt;/p&gt;
&lt;p&gt;전체 시간복잡도는 $L_{G}$의 characteristic polynomial을 계산하는 $O(n^3)$이 된다.&lt;/p&gt;</description>
      <category>알고리즘 문풀/BOJ 연습</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/160</guid>
      <comments>https://drugstoreoftamref.tistory.com/160#entry160comment</comments>
      <pubDate>Thu, 17 Apr 2025 09:01:58 +0900</pubDate>
    </item>
    <item>
      <title>Correlation Clustering</title>
      <link>https://drugstoreoftamref.tistory.com/159</link>
      <description>&lt;p&gt;Correlation clustering은 그래프의 정점들을 cluster들로 분할하는데, 각 간선 $e$에는 두 종류의 weight $w_{e}^{+}$와 $w_{e}^{-}$가 있다. 두 endpoint가 같은 cluster에 있으면 $w_{e}^{+}$점, 다른 cluster에 있으면 $w_{e}^{-}$점을 얻는다. 목표는 점수의 합을 최대화하는 clustering을 찾는 것이다. 이 문제는 NP-hard임이 알려져 있고, Max cut처럼 SDP를 이용한 constant factor approximation이 알려져 있다.&lt;br&gt;이번에도 직관적인 $0.5$-approximation이 있는데, 모든 정점을 한 cluster에 놓거나 / 정점을 다 다른 cluster에 두거나 둘 중 나은 것이 최적해의 절반 이상이 된다. SDP를 이용하여 $0.75$-approximation을 얻을 것이다.&lt;/p&gt;
&lt;p&gt;사실 이런 maximization problem이라고 해도 $2$-approximation, $1.33$-approximation 처럼 역수로 쓰는 게 보통인데, 혼란을 방지하기 위해 이번에는 $1$보다 작은 수로 표기한다.&lt;/p&gt;
&lt;h1&gt;NP-hardness&lt;/h1&gt;
&lt;p&gt;이거 대충 날먹하려고 했는데 생각보다 어렵다;; 정확히는 unweighted variant의 hardness를 구하는 것이 어렵다.&lt;br&gt;Multiway-cut problem은 terminal set $s_{1}, \cdots, s_{k}$가 주어졌을 때 각각을 전부 disconnect하는 edge set의 weight를 minimize하는 문제이다. $k=2$일 때 유명한 $(s, t)$ min cut 문제가 되지만, 일반적인 $k$에 대해서는 NP-hard임이 알려져 있다.&lt;/p&gt;
&lt;p&gt;Multiway cut problem의 instance가 주어졌을 때, 원래 간선 $e$의 weight가 $w_{e}$였다면 $w_{e}^{+} = 0, w_{e}^{-} = w_{e}$로 assign해주고, 특히 $s_{i}, s_{j}$를 잇는 $w(s_{i}, s_{j})^{+} = -\infty, w(s_{i}, s_{j})^{-} = 0$의 간선을 추가해주고 correlated clustering을 찾으면 그게 곧 multiway cut이 되므로 NP-hardness가 증명된다.&lt;/p&gt;
&lt;p&gt;그럼 Multiway cut의 hardness는 어떻게 보이냐? 그건 나중에 다룰 일이 있겠지..&lt;/p&gt;
&lt;h1&gt;SDP relaxation&lt;/h1&gt;
&lt;p&gt;지난 번 MAX-CUT 문제에서는 각 정점을 $\mathbf{S}^{n-1}$의 한 축을 기준으로 분할하는 방법을 생각했었다. 이번에도 아이디어는 비슷한데, 우선 원본 문제를 아래와 같이 나타낼 수 있다.&lt;br&gt;$$\begin{aligned} \mathrm{maximize} &amp;amp; \sum_{(i, j) \in E} w_{ij}^{+} (v_{i} \cdot v_{j}) + w_{ij}^{-} (1 - v_{i} \cdot v_{j}) \\ \mathrm{s.t.} &amp;amp; v_{i} \in \lbrace \mathbf{e} _ {1}, \cdots, \mathbf{e} _ {n} \rbrace \end{aligned}$$&lt;/p&gt;
&lt;p&gt;이번에도 똑같이 $v_{i} \cdot v_{i} = 1$로 relax한 뒤 SDP를 풀어주면 될 것 같다. 다만 이번엔 원본인 Integer program의 특성상 모든 성분이 양수면 좋을 것 같은데, 이 제약조건을 어떻게 modeling해줄 수 있을까? 단순히 생각해서, 두 벡터의 각도가 90도 이하여야 하니 $v_{i} \cdot v_{j} \ge 0$을 제약 조건으로 걸어주자. 이래도 여전히 SDP가 된다.&lt;/p&gt;
&lt;p&gt;이제 이걸 rounding해줘야 한다. 놀랍게도 축을 두 개 잡아주는 것만으로 꽤 좋은 근사치를 얻을 수 있다.&lt;br&gt;두 독립인 벡터 $r_{1}, r_{2} \in \mathbf{S}^{n-1}$에 대해 $r_{1} \cdot v_{i}, r_{2} \cdot v_{i}$의 부호에 따라, 총 4개의 cluster를 만들어주자.&lt;/p&gt;
&lt;p&gt;MAX CUT에서, 두 벡터 $v_{i}, v_{j}$가 $r_{1}$을 기준으로 같은 쪽에 있을 확률은 $1 - \frac{\cos^{-1}(v_{i} \cdot v_{j})}{\pi}$임을 보였다. 따라서, $v_{i}, v_{j}$가 같은 클러스터에 있을 확률은 $(1 - \frac{\cos^{-1}(v_{i} \cdot v_{j})}{\pi})^{2}$가 된다. 따라서 간선 $(i, j) \in E$에서 얻을 수 있는 점수의 기댓값은&lt;br&gt;$$w_{ij}^{+}\left(1 - \frac{\cos^{-1}(v_{i} \cdot v_{j})}{\pi}\right)^{2} + w_{ij}^{-}\left(1 - \left(1 - \frac{\cos^{-1}(v_{i} \cdot v_{j})}{\pi}\right)^{2}\right)$$&lt;br&gt;가 된다. 당연하지만, 이제 이 식을 $C \times \left[ w_{ij}^{+} (v_{i} \cdot v_{j}) + w_{ij}^{-} (1 - v_{i} \cdot v_{j}) \right]$로 lower bound해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lemma.&lt;/strong&gt; $0 \le x \le 1$에 대해, $(1 - \cos^{-1}(x)/\pi)^{2} \ge 0.75x$.&lt;br&gt;또한, $(1 - (1 - \cos^{-1}(x) / \pi)^{2}) \ge 0.75(1-x)$.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Proof.&lt;/em&gt; $(1 - x/\pi)^{2} - 0.75\cos x$가 $[0, \pi/2]$에서 $[0, 0.25]$에 들어감을 증명하면 된다. 남은 증명은 Wolframalpha가 해준다.&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.designofapproxalgs.com/book.pdf&quot;&gt;https://www.designofapproxalgs.com/book.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS 이론/알고리즘</category>
      <category>approximation</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/159</guid>
      <comments>https://drugstoreoftamref.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 10 Feb 2025 09:33:40 +0900</pubDate>
    </item>
    <item>
      <title>Samuelson-Berkowitz Algorithm</title>
      <link>https://drugstoreoftamref.tistory.com/158</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25510&quot;&gt;https://www.acmicpc.net/problem/25510&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://infossm.github.io/blog/2022/08/18/CharPoly/&quot;&gt;https://infossm.github.io/blog/2022/08/18/CharPoly/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Division-Free Determinant에 대해 위 문제를 내고 글도 썼는데, 최근 훨씬 간단한 알고리즘이 있다고 해서 정리해보려고 한다.&lt;/p&gt;
&lt;p&gt;원본 글에 달린 것과 동일하게 $\mathcal{O}(n^4)$에 동작하는 division-free characteristic polynomial 알고리즘이다.&lt;/p&gt;
&lt;h1&gt;Algorithm&lt;/h1&gt;
&lt;p&gt;$n \times n$ 행렬 $A = (a_{ij})$에 대해, $A_{i}$를 $i\dots n$번째 행, 열만 따와서 만든 크기 $n-i+1$의 정사각행렬이라고 하자. 당연히 $A_{1} = A$이다.&lt;/p&gt;
&lt;p&gt;$p_{1}(x) = \det(x I - A)$를 cofactor expansion으로 계산하면 $p_{1}(x) = (x - a_{11})\det(x I - A_{2}) - a_{12} \det (\cdots) \cdots $ 와 같은 형태로 나올 텐데, 사실 훨씬 간단한 형태로 계산할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lemma.&lt;/strong&gt;&lt;br&gt;$A$를 $\begin{pmatrix} a_{11} &amp;amp; R \\ C &amp;amp; A_{2} \end{pmatrix}$로 쓰자. 즉 $R, C$를 각각 크기 $n-1$의 row/column 벡터로 볼 때,&lt;br&gt;$$p_{1}(x) = (x - a_{11})p_{2}(x) - R\mathrm{adj}(x I - A_{2})C.$$&lt;/p&gt;
&lt;p&gt;여기서 $\mathrm{adj}(A)$는 $A \mathrm{adj}(A) = (\det A)I 를 만족하는 행렬로, $(-1)^{i+j}\det (A_{-j, -i})$를 $(i, j)$원소로 가진다. $A_{-i, -j}$는 $A$의 $i$번째 행, $j$번째 열을 제외한 크기 $n-1$의 정사각행렬인데, 말이 어렵지만 사실 cofactor expansion을 행렬로 적은 것이다.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Proof.&lt;/em&gt; $(xI - A)\mathrm{adj}(xI - A) = p_{1}(x) I$ 의 $(1, 1)$을 보자. $xI - A$의 첫번째 row는 $\begin{pmatrix} x - a_{11} &amp;amp; -R$이고, $\mathrm{adj}(xI - A)$의 첫번째 column은 당연히 첫 원소에 $p_{2}(x)$가 있을 테지만, $j &amp;gt; 1$에 대해서는 $xI - A_{2}$의 $j-1$번째 column을 빼고, 첫 행에 $-C$를 집어넣은 행렬에 $(-1)^{1+j}$를 곱한 값이다.&lt;/p&gt;
&lt;p&gt;여기서 다시 cofactor expansion을 진행하자. 이번에는 첫 column ($-C$)를 빼고 다른 row들을 빼면서 내려가면, 이는 $(-1)^{1+j} \sum_{i=1}^{n-1} (-1)^{1+i} (-C) _ {i} \det (A_{2}) _ {-i, -(j-1)}$ 이 된다. 이는 곧 $(\mathrm{adj}(xI - A_{2}) C) _ {j-1}$이 됨을 알 수 있다. $\square$&lt;/p&gt;
&lt;p&gt;따라서 $R \mathrm{adj}(x I - A_{2}) C$ 를 계산하는 게 중요한데, $\mathrm{adj}(x I - A)$ 꼴에 대한 다음 lemma가 중요하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lemma.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$\det(xI - A) = p_{0} x^{n} + \cdots + p_{n}$이라고 하자. $\mathrm{adj}(xI - A) = \sum_{k=1}^{n} x^{n-k} (p_{0}A^{k-1} + \cdots + p_{k-1})$가 성립한다.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Proof.&lt;/em&gt; Cayley-Hamilton theorem에 의해서 $p(A) = 0$이다. $p(x) - p(A) = \sum_{k = 0}^{n} p_{k} (x^{n-k}I - A^{n-k})$를 생각하고, 이들을 $xI - A$로 나누면 $\sum_{k = 0}^{n} p_{k} \sum_{i = 0}^{n-k-1} x^{n-k-1-i}A^{i}$가 되고, 이걸 정리하면 위 식을 얻는다.&lt;/p&gt;
&lt;p&gt;따라서 이 두 식을 조합하면, $p_{2}(x) = q_{0}x^{n-1} + \cdots + q_{n-1}$이라고 하면&lt;br&gt;$$p_{1}(x) = (x - a_{11})p_{2}(x) - \sum_{k=0}^{n-2} q_{k}(x^{n-k-2} + (RA_{2}C)x^{n-k-3} + \cdots + (RA_{2}^{n-k-2}C))$$&lt;/p&gt;
&lt;p&gt;를 얻는다. 이 때 $R A_{2}^{i} C$는 $i = 1, \cdots, n$에 대해 $\mathcal{O}(n^3)$ 시간에 계산할 수 있고, $A_{2}$에 대해 재귀적으로 문제를 해결하면 전체 $\mathcal{O}(n^{4})$ 시간복잡도를 갖는다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Samuelson%E2%80%93Berkowitz_algorithm&quot;&gt;위키피디아의 식&lt;/a&gt;이 이렇게 유도되는데, 이를 잘 분해하면 $n$개의 toeplitz matrix (대각선을 따라 constant인) 의 곱을 얻는데, 이는 원래 행렬 $A$에서 모두 얻을 수 있어 병렬적으로 계산이 가능하다. 아쉽게도 두 toeplitz matrix의 곱이 toeplitz라는 보장은 없기 때문에 단순 곱셈보다 빠르게 계산할 수는 없는 것 같다.&lt;/p&gt;</description>
      <category>CS 이론/알고리즘</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/158</guid>
      <comments>https://drugstoreoftamref.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 6 Feb 2025 11:19:21 +0900</pubDate>
    </item>
    <item>
      <title>LGV lemma [WIP]</title>
      <link>https://drugstoreoftamref.tistory.com/157</link>
      <description>&lt;p id=&quot;firstHeading&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;Lindstr&amp;ouml;m&amp;ndash;Gessel&amp;ndash;Viennot lemma는 DAG의 non-intersecting path를 셀 때 사용할 수 있는 공식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;$G = (V, E)$에서 $2n$개의 정점 $a_{1}, \cdots, a_{n}$, $b_{1}, \cdots, b_{n}$을 생각하자. 어떤 두 path가 intersecting하다는 것은 둘 사이에 공통된 정점이 있다는 것이다. path tuple $P = (P_{1}, \cdots, P_{n})$에 대해 $P_{i}$가 $a_{i}$를 $b_{\sigma(i)}$로 보내고, $\sigma$가 순열이면 이러한 $P$를 path system이라고 하자. $P$가 non-intersecting이면 non-intersecting path system이라고 부르고, 이들의 집합을 $\mathcal{N}$이라고 쓰자.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;Lemma. (LGV)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;$p(u, v)$를 $u$에서 $v$로 가는 서로 다른 경로의 수라고 하자. 이 때 $\sum_{P \in \mathcal{N}} \mathrm{sgn}(\sigma) = \det( p(a_{i}, b_{j}) ) $이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;Proof. &lt;/i&gt;어떤 순열 $\sigma : [n] \to [n]$과 $a_{i} \to b_{\sigma(i)}$ path $Q_{i}$를 생각하자. 가능한 경우는&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;1. $\sigma = \mathrm{id}$, non-intersecting (good)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;2. intersecting&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;2번 경우에, 어떤 $i \neq j$와 intersecting하는 최소의 $i$를 찾을 수 있다. 이제 $i$와 intersecting하는 $j$중에서 최대의 $j$를 찾을 수 있다. $i$의 정의에 의해 $i &amp;lt; j$가 된다. 이제 둘이 만나는 정점 중 minmal한 (DAG의 partial order 기준) 정점을 $x$라고 하고, $Q_{i}$와 $Q_{j}$를 $x$ 전후로 바꿔주자. 이렇게 얻은 경로들을 $Q_{k}^{\prime}$라고 쓰자. 당연히 $k \neq i, j$에 대해서는 $Q_{k}^{\prime} = Q_{k}$이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;이 때 $Q_{k}^{\prime}$에 동일한 변환을 가하면 다시 $Q_{k}$가 된다. 즉 이 변환은 involution인데, $Q, Q^{\prime}$에 대응되는 $\sigma$의 홀짝성은 정확히 반대가 된다. 따라서 2번의 항을 다 더하면 0이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;1번의 항이 우리가 원하는 좌변의 항과 똑같기 때문에 lemma를 증명할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Plane Partition&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$n \times m$ 격자의 각 칸에 $1$ 이상 $K$ 이하의 양의 정수 $a_{i, j}$ $(1 \le i \le n, 1 \le j \le m)$를 써넣되, 다음 조건을 만족하게 적고 싶다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. weakly column-increasing: $a_{i, j} \le a_{i, j+1}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. weakly row-increasing $a_{i, j} \le a_{i+1, j}$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 $a_{i, j}$의 개수는 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 알려진 대응 중 하나는, 격자에서 $P_{t}$를 $t$ 이하의 칸들이라고 할 때, $P_{t}$와 $P_{t}^{C}$의 경계선이 up-right path -&amp;nbsp; row 번호가 감소하고, column 번호가 증가하는 - 를 이룬다는 사실을 이용한다. 이 경로를 $S_{1}, \cdots, S_{K-1}$이라고 생각하자. $S_{K}$는 $P_{K}$가 전체집합이기 때문에 자명하므로 신경쓰지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 $S_{i}$와 $S_{i+1}$은 &quot;거의 non crossing&quot;이라고 생각할 수 있다. 이 둘은 꼭짓점을 공유할 수 있지만, 공통 간선을 가질 수 없으며 $S_{i}$는 항상 $S_{i+1}$보다 위에 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 $S_{i}$들이 $(n, 0) \to (0, m)$으로 향하는 경로들이라면, $S_{i}$를 동남쪽으로 $i$칸 shift한 경로 $S_{i}^{\prime}$는 $(n+i, i) \to (i, m+i)$로 볼 수 있다. 이들은 놀랍게도 non-intersecting path system을 이룬다. DAG는 그리드에서 자연스럽게 $(i, j) \to (i-1, j), (i, j-1)$로 간선을 이어준 것으로 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 DAG에서 non-intersecting path system은 오직 $(n+i, i) \to (i, m+i)$인 경로들만 가능하다. 즉 $\sigma \neq id$ 인 경우는 가능하지 않다. 따라서 우리가 원하는 경우의 수를 LGV formula를 이용하여 바로 얻을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬의 원소는 $(n+i, i) \to (j, m+j)$ 경로의 수이기 때문에 $(n + m)! / (n + i - j)! (m + j - i)!$ 이 된다. 이 determinant는 닫힌 꼴로 얻을 수 있다고 하는데.. 거기까진 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\det$가 multilinear하기 때문에 각 간선, 혹은 path 하나에 변수 $w_{i, j}$를 집어넣어도 식이 동일하게 성립한다. 이를 이용해서 해결하는 문제로 &lt;a href=&quot;https://www.acmicpc.net/problem/21265&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/21265&lt;/a&gt;&amp;nbsp;가 있다.&lt;/p&gt;</description>
      <category>수학 이론/이산수학</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/157</guid>
      <comments>https://drugstoreoftamref.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 4 Feb 2025 07:31:39 +0900</pubDate>
    </item>
    <item>
      <title>BOJ 21268 Do Use FFT</title>
      <link>https://drugstoreoftamref.tistory.com/156</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/21268&quot;&gt;https://www.acmicpc.net/problem/21268&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;솔루션에서 Tellegen&amp;#39;s Principle을 인용하고 있어서 지난 포스트와 연관해 작성해본다. 머리 좋은 사람들은 아마 생각하지 않고도 풀 수 있을 것 같다.&lt;/p&gt;
&lt;h2&gt;Without Tellegen&amp;#39;s principle&lt;/h2&gt;
&lt;p&gt;$E_{k} = \sum_{i = 1}^{n} C_{i} \prod_{j = 1}^{k} (A_{i} + B_{j})$를 답이라고 하자.&lt;/p&gt;
&lt;p&gt;$i$와 관련한 항들을 사부작거리다보면, $P_{j} = \sum_{i = 1}^{n} C_{i}A_{i}^{j}$를 미리 계산해두면 편할 것 같다.&lt;/p&gt;
&lt;p&gt;$\sum_{j} F_{k, j}x^{j} = (x+B_1)(x+B_2)\cdots (x+B_{k})$라고 두면, $E_{k} = \sum_{j} P_{j} F_{k, j}$가 된다는 사실을 알 수 있다. 만약 $F_{k, k-j}$꼴이었다면 전형적인 다항식 곱하기인데 미묘하게 다르다. 그럴때는 $x \leftarrow x^{-1}$을 대입해주고 $x^{k}$를 곱해서 $G_{k}(x) = (B_1 x + 1) \cdots (B_k x + 1)$을 생각해주자.&lt;/p&gt;
&lt;p&gt;그러면 $P(x) = \sum_{j} P_{j}x^{j}$를 생각했을 때 $E_{k} = [x^k] P(x)G_{k}(x)$가 된다. 일단 $G_{1}(x), \cdots, G_{n}(x)$를 다 곱해볼 수는 당연히 없고, 각 $k$마다 $x^k$의 계수만 필요하다는 것에 주목해 분할 정복을 생각해보자.&lt;/p&gt;
&lt;p&gt;구간 $[s, e]$에 대해 $E_{s}, \cdots, E_{e}$를 구해야 한다고 생각해보자. $P(x)G_{s-1}(x)$를 미리 알고 있다고 가정하고, $[s, m]$에 대한 oracle을 호출해 $E_{s}, \cdots, E_{m}$까지는 알고 있다고 가정한다. 이제 $P(x)G_{s-1}(x)$에 $(B_s x + 1) \cdots (B_m x + 1)$을 곱해서 $P(x)G_{m}(x)$를 만들고 $[m+1, e]$로 분할정복을 하고 싶다.&lt;/p&gt;
&lt;p&gt;문제는 $P(x)$의 차수가 $n$까지 커질 수 있으니 분할 정복이 안 된다. 연산량이 적어도 $e-s$에 대한 함수로 나와야 할 텐데..&lt;/p&gt;
&lt;p&gt;그런데 잘 생각해보면 $i \in [m+1, e]$에 대해 $P(x)G_{i}(x)$의 $i$차항은 $(B_{m+1} x + 1) \cdots (B_{i} x + 1)$이 $i - m$차식임을 고려할 때 $P(x)G_{m}(x)$의 $m$차항 이상 $e$차항 이하만 확인하면 된다는 사실을 알 수 있다.&lt;/p&gt;
&lt;p&gt;그렇다면 $P(x)G_{s-1}(x)$를 다 들고 다니는 대신, $P(x) G_{s-1}(x)$의 $[s, e]$차항만 들고 다니자. 이는 $e - s+1$차식으로 충분히 감당 가능하다. $[s, m]$ 구간을 분할정복하고, $m-s$차식인 $(B_s x + 1) \cdots (B_m x + 1)$을 곱하고, $[m+1, e]$차항만 뽑아내서 $[m+1, e]$ 구간을 분할정복해주면 된다. $\mathcal{O}((e - s)\log (e - s))$ 정도의 연산이 필요하니 전체 시간 복잡도는 $\mathcal{O}(N \log^{2} N)$이다.&lt;/p&gt;
&lt;p&gt;$P(x)$를 어떻게 계산하는지 설명 안 했는데, 결국 $P(x) = \sum_{i = 1}^{n} \frac{C_i}{1 - A_{i} x}$꼴이다. $C_{i} = 1$인 경우에는 적분식이 $\log \prod_{i = 1}^{n} (1 - A_{i}x)$ 꼴인 걸 이용해서 곱하고 로그취하고 미분하는 방식이 있는데, 사실 그냥 더 간단하게 분할 정복으로 분자, 분모를 유지하면서 더해주면 역시 $\mathcal{O}(N\log^{2} N)$이면 된다.&lt;/p&gt;
&lt;h2&gt;With &lt;a href=&quot;https://tamref.com/154&quot;&gt;Tellegen&amp;#39;s Principle&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;$E_{k} = \sum_{j} P_{j} F_{k, j}$ 에서, $F_{k, j}$를 행렬로 보는 것이 자연스럽다. 그렇다면 이 transpose는 어떨까?&lt;br&gt;벡터 $a_{1}, \cdots, a_{N}$이 주어졌을 때 $b_{j} = \sum_{k} a_{k} F_{k, j}$를 구한다고 생각해보면, $\sum_{j} b_{j} x^{j} = \sum_{k} a_{k}(x + B_1) \cdots (x + B_k)$가 되는 걸 알 수 있다. 저 다항식 곱 계산은 분할 정복으로 쉽게 할 수 있다.&lt;/p&gt;
&lt;p&gt;Tellegen&amp;#39;s principle을 적용하여 해당 알고리즘의 transpose를 구해보자. 가장 자연스러운 분할 정복 알고리즘은 다음과 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def solve([s, e], a) -&amp;gt; polynomial[x]:
    if s == e:
        return a[s] # constant polynomial

    m = (s + e) / 2
    p = solve([s, m], a)
    B = (x + B_s) ... (x + B_m) # acquired from another DnC
    q = solve([m+1, e], a)

    return p + B * q&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;즉 &lt;code&gt;solve(s, e, a)&lt;/code&gt;라는 연산자는 $e-s+1$개의 수 $a_s, \cdots, a_e$를 입력으로 받아 똑같이 $\sum_{j} \beta_{j}x^{j} = p + Bq$를 만족하는 $\beta_s, \cdots, \beta_e$로 돌려주는 linear operator로 생각할 수 있다. 딱딱하게 쓰면,&lt;/p&gt;
&lt;p&gt;$$\mathrm{solve}[s, e] = \mathrm{solve}[s, m] + \mathrm{multiply}_{B} \circ \mathrm{solve}[m+1, e]$$&lt;/p&gt;
&lt;p&gt;이 transpose는 다음과 같다.&lt;br&gt;$$\mathrm{solve}^{\mathbf{t}}[s, e] = \mathrm{solve}^{\mathbf{t}}[s, m] + \mathrm{solve}^{\mathbf{t}}[m+1, e] \circ \mathrm{multiply}_{B}^{\mathbf{t}}$$&lt;/p&gt;
&lt;p&gt;지난 포스트에서 multiply의 transpose가 middle product라고 썼는데, 나한테는 이것저것 다 헷갈려서 그냥 $B(x^{-1})$을 곱하고 non-negative 차수만 남긴 거라고 외운다. 이 연산이 어떻게 생겼는지 구현하다보면 위의 풀이와 완전히 동일한 결론을 얻는다.&lt;/p&gt;
&lt;p&gt;여담으로 $P(x)$를 계산하는 과정 역시 dual이 있는데, $C_{i}$가 주어졌을 때 $P(x)$를 계산하는 것을 generalized power sum이라고 하고, 그 transpose는 multiple point evaluation이 된다. &lt;/p&gt;</description>
      <category>알고리즘 문풀/BOJ 연습</category>
      <category>computer-algebra</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/156</guid>
      <comments>https://drugstoreoftamref.tistory.com/156#entry156comment</comments>
      <pubDate>Fri, 31 Jan 2025 00:24:43 +0900</pubDate>
    </item>
    <item>
      <title>Approximation of MAX CUT</title>
      <link>https://drugstoreoftamref.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 다룰 Max Cut 문제는 non-negative weighted undirected graph $G = (V, E, w)$에 대해서 $S \subseteq V$를 골라서 $vE(S, V - S)$의 weight 합을 최대화하는 문제이다. 다항 시간 알고리즘이 알려진 min cut에 비해 이 문제는 NP-hard임이 알려져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NP-hard problem의 경우 여러 근사 알고리즘들이 존재하는데, 가장 naive한 알고리즘부터 생각해보자. 임의의 $S \subseteq V$에 대해 $E(S, V-S)$의 weight 합, 즉 $\sum_{e \in E(S, V-S)} w(e)$를 $w(\partial S)$라고 표기하자. $w(\partial S)$의 가능한 최댓값, 즉 MAX CUT을 $\mathrm{OPT} = w(\partial S^{OPT})$라고 표기한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 정점에 $1/2$의 확률로 0, 1을 라벨링하고, 0으로 라벨링 된 정점을 $S$로 선택한다. 이 경우 각 간선이 cut에 포함될 확률은 $1/2$이기 때문에 $\mathbb{E}[w(\partial S)] = \sum_{e} w(e)/2 \ge \mathrm{OPT}/2$가 된다. 즉 이 알고리즘은 Max Cut 문제의 (randomized) $1/2$-approximation algorithm이 된다.&lt;/p&gt;
&lt;h1&gt;Goemans-Williamson Algorithm&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Approximation algorithm을 찾을 때 많이 사용하는 전략 중 하나가 문제를 Integer Linear Program으로 표현하는 것이다. 각 정점 $i$에 대해 변수 $x_{i}$를 정의하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{aligned} \mathrm{maximize} &amp;amp; \sum_{i, j \in E} \frac{w _ {i,j}}{2}(1 - x_{i}x_{j}) \\ \mathrm{s.t.} &amp;amp; x_{i} \in \lbrace -1, 1 \rbrace \end{aligned}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$x_{i} = -1$인 정점 $i$의 모임을 $S$로 생각하면 이 문제가 max cut을 모델링한다는 것을 확인할 수 있다.&lt;br /&gt;가장 편하게 할 수 있는 생각은 $x _ {i} \in [-1, 1]$이도록 relaxation해주는 것인데, 두 가지 문제가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LP와 다르게 objective function이 $x$에 대해 non-linear하다. 이를 다항 시간 안에 해결할 수 있는가?&lt;/li&gt;
&lt;li&gt;어떤 최적해 $x^{\ast}$가 주어졌을 때, 이를 어떻게 $\hat{x} \in {-1, 1}^{n}$으로 rounding할 수 있겠는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 relaxation으로는 두 가지 모두에 대해 긍정적인 답을 하기 어렵다. Goemans-Williamson algorithm은 이 문제를 Semidefinite programming으로 접근한다. 각 정점의 라벨에 해당하는 변수 $x _ {i}$를 실수 하나가 아닌 $n$차원 unit vector $v _ {i}$에 대응시키자. $n$은 정점 개수와 정확히 같다. 다시 모델링 된 문제는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{aligned} \mathrm{maximize} &amp;amp; \sum_{i, j \in E} \frac{w _ {i,j}}{2}(1 - v_{i} \cdot v_{j}) \\ \mathrm{s.t.} &amp;amp; v_{i} \cdot v_{i} = 1 \end{aligned}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 문제 전체가 SDP의 형태를 띠고 있기 때문에 항상 다항 시간 해결법이 존재한다. (각 벡터가 $n$차원이어야 SDP의 조건을 만족한다) 또한 임의의 max cut $S^{OPT}$의 경우 $i \in S^{OPT}$일 때 $i = \mathbf{e} _ {1}$, 그렇지 않으면 $i = -\mathbf{e} _ {1}$으로 두 antipodal한 벡터로 정점들을 갈라놓으면 이는 항상 feasible SDP solution이 되므로, 위 SDP는 max cut의 실제 relaxation이기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 두 번째 질문인, SDP solution을 어떻게 max cut으로 바꿀 것이냐는 rounding 문제를 해결해야 한다. 가장 단순하게는 아무 &quot;적도&quot;를 잡아서, 북반구를 $+1$, 남반구를 $-1$에 대응시키면 될 것 같다. 이를 좀 더 엄밀하게 표현하면, 어떤 unit vector $p$을 잡아 $v_{i} \cdot p \ge 0$인 $i$들을 $S$ 로 설정한다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 $p$를 어떻게 찾는지는 별로 안 궁금하니, 일단 그런 $p$를 잘 잡을 수 있다고 생각하자. 즉, $n$차원 sphere위에서 uniformly random하게 뽑은 한 벡터 $p$를 어떻게 잘 가지고 왔다고 하자. 이제 이로 인해 생기는 cut의 value와 optimum LP value 사이의 관계식이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상식적으로 두 벡터 $v _ {i}, v _ {j}$가 antipodal하다면 간선 $ij$는 무조건 cut에 포함될 것이고, 같은 방향이라면 절대 cut에 포함되지 않을 것이다. 만약 두 벡터가 이루는 각이 $0 &amp;lt; \theta _ {ij} &amp;lt; \pi$ 라면 어떨까? 구를 그려놓고 $v _ {i}$를 북반구에 포함시킬 $p$의 범위같은 걸 그려보면, 둘이 다른 반구에 속할 확률이 $\frac{\theta _ {ij}}{\pi}$ 가 됨을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, $\mathbb{E} _ {p} [ w(\partial S) ] = \sum_{i, j \in E} w _ {ij}\frac{\theta _ {ij} }{\pi}$가 된다.&lt;br /&gt;한편 LP optimum의 경우 $\sum_{i, j \in E} w _ {ij} \frac{1}{2}(1 - v_{i} \cdot v_{j}) = \sum_{i, j \in E} w _ {ij} \frac{1}{2}(1 - \cos \theta _ {ij})$가 될 테니, $\min_{0 \le t \le \pi} \frac{t/\pi}{1/2(1 - \cos t)} $가 approximation ratio가 될 것이다. 이는 $t \approx 2.33$에서 약 $0.878$이 나온다. 즉, max cut에 대한 $0.878$-approximation algorithm을 얻은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에선 생략했지만, unit sphere 위에서 $p$를 uniform random sampling하는 것은 생각보다 간단하다. $p$의 각 coordinate을 $\mathcal{N}(0,1)$에서 뽑고, 이를 normalize해주면 된다.&lt;/p&gt;
&lt;h1&gt;Inapproximability of MAX CUT under Unique Games Conjecture&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unique Games Conjecture는 주변인에게서 여러 번 들었지만 아직도 공부가 부족하다. 이게 왜 Game인지도 모르겠고, 이게 어렵다고 생각하게 된 동기도 아직 잘 모르겠다. 실제로 Subhash Khot이 2002년 경 제안한 개념으로 그렇게 오래된 문제는 아니지만, inapproximability에 관한 여러 bound를 혁신적으로 줄여서 주목받은 것으로 알고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Definition (Bipartite Unique Games)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그래프 $G = (U \cap V, E)$가 주어진다.&lt;/li&gt;
&lt;li&gt;또한, &quot;alphabet size&quot; $k$가 주어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 임무는, 각 정점에 $1$에서 $k$의 수를 labeling하는 것이다. 이 때 제약 조건이 아래와 같이 주어진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 간선 $e = uv$마다 &quot;required permutation&quot; $\pi _ {e} \in S_{k}$가 존재한다. $i, j \in [k]$에 대해 $\pi_{e} (i) = j$라는 것은, $u$의 label이 $i$라면 $v$의 label이 $j$여야 한다는 것을 의미한다. 이 조건이 만족된다면 간선 $e$는 &quot;satisfied&quot;되었다고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌써부터 문제가 어려운데, conjecture의 내용은 더 아리송하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Definition. (Unique Games Conjecture)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAP-$(\varepsilon, 1 - \varepsilon)$ unique games 문제의 경우, 출제자가 다음을 보장해준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적어도 전체의 $1 - \varepsilon$ 이상의 간선이 satisfy되는 labeling이 존재한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;또는,&lt;/b&gt; 어떤 labeling도 전체의 $\varepsilon$ 이상을 satisfy시킬 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 임무는 주어진 instance가 어느 쪽에 속하는지 알아내는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unique Games Conjecture란, &lt;b&gt;모든&lt;/b&gt; $\varepsilon &amp;gt; 0$에 대해 GAP-$(\varepsilon, 1 - \varepsilon)$-unique games가 np-hard가 되는 &lt;b&gt;어떤 상수&lt;/b&gt; $k$가 존재한다는 것을 의미한다. $k$가 상수라는 것은, 앞으로 복잡도에 있어 $k$는 고려하지 않는다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌든, 우리는 이 unique games 문제를 max-cut으로 reduction하여 approximation hardness를 보일 것이다. 이를 GAP-preserving reduction이라고도 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Claim.&lt;/b&gt; 모든 $\varepsilon^{\prime} &amp;gt; 0$, $\rho \in (-1, 0]$에 대해, GAP-$(\varepsilon, 1 - \varepsilon)$-UG를 GAP-$(\frac{\cos^{-1} \rho}{\pi} + \varepsilon^{\prime}, (1 - 2\varepsilon)\frac{1 - \rho}{2})$-MAX CUT을 이용하여 해결할 수 있도록 하는 $\varepsilon &amp;gt; 0$이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAP-$(\alpha, \beta)$ max cut이란, 편의상 간선의 weight 합이 $1$이라고 가정했을 때&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;value가 $\alpha$ 이상인 cut이 존재하거나&lt;/li&gt;
&lt;li&gt;value가 $\beta$ 이상인 cut이 존재하지 않음&lt;br /&gt;을 보장해주는 문제이다. 만약 Claim이 사실이라면, max cut의 approximation ratio는 $\left(\frac{\cos^{-1} \rho}{\pi} + \varepsilon^{\prime}\right) / (1 - 2\varepsilon)\frac{1 - \rho}{2}$ 를 넘을 수 없다. approximation solution의 value만 보고 GAP 문제를 바로 해결할 수 있기 때문이다. $\rho \in (-1, 0]$에 대해 식을 최소화하면 $\frac{0.878 + \varepsilon^{\prime}}{1 - 2\varepsilon}$를 얻는데, $\varepsilon^{\prime}$을 조정하면 임의의 $\varepsilon^{\prime} &amp;gt; 0$에 대해 $0.878 + \varepsilon^{\prime}$ approximation hardness를 보인 셈이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 UG instance, 즉 bipartite graph $G = (U \cup V, E)$와 순열들 $\pi_{e}$가 주어졌을 때 max cut instance $G^{\prime}$로 만들자. 원하는 바를 다시금 정리하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(Completeness) 전체의 $1 - \varepsilon$이상을 만족시키는 labeling $l$이 존재하면, $G^{\prime}$에는 $(1 - 2\varepsilon)\frac{1 - \rho}{2}$ 이상의 value를 갖는 cut이 존재한다.&lt;/li&gt;
&lt;li&gt;(Soundness) 만약 모든 labeling이 전체의 $\varepsilon$밖에 만족시키지 못한다면, $G^{\prime}$에는 value가 $\frac{\cos^{-1} \rho}{\pi} + \varepsilon^{\prime}$ 이상인 cut이 존재하지 않는다. 뒤집어 말해, $G^{\prime}$에 value가 그보다 높은 cut이 존재한다면 $\varepsilon$ 이상을 만족시키는 labeling $l$이 존재해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reduction은 굉장히 비직관적으로 만든다. $G'$의 정점은 $V \times 2^{[k]}$가 될 것인데, 즉 $v \in V, S \subseteq [k]$마다 정점 $(v, S)$가 생길 것이다. $V$는 UG instance에서 bipartite graph의 한 쪽 정점임에 주목하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 $(v, S), (w, T)$마다 간선을 이어줄 건데, 이 간선의 weight는 &lt;b&gt;아래의 시행으로 인해 이 간선이 출력될 확률&lt;/b&gt;로 정의한다. weight가 확률이니, 모든 간선의 weight를 더하면 $1$이 나올 것은 자명하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. $u \in U$를 uniform하게 고른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. $v, w \in \mathcal{N}(u)$를 uniformly random, independent하게 고른다. (두 정점이 다를 필요는 없다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. $S_{1} \subseteq [k]$를 uniformly random하게 고른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. $T_{1} \subseteq [k]$를 고르되, 각 $i \in [k]$에 대해 $\Pr[(i \in S_{1}) = (i \in T_{1})] = \frac{1 + \rho}{2}$가 성립하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. $e = uv \in E(G)$에 대해, $S = \pi_{e}(S_{1})$, 마찬가지로 $T = \pi_{uw}(T_{1})$으로 바꾼다. 즉, $X = \pi(X_{1})$이란 오른쪽을 $X_{1}$ 중 하나로 고르고 싶을 때 왼쪽에 가능한 label의 목록이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;output: $(v, S)$와 $(w, T)$ 사이의 간선.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 cut의 weight만 볼 거기 때문에 각 간선의 weight를 정확하게 계산하는 건 머리만 아프지 별로 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Completeness Proof&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 어떤 labeling $l : U \cup V$가 존재해서, 전체의 $1 - \varepsilon$에 해당하는 간선 $e=uv$에 대해 $\pi_{e}(l(u)) = l(v)$가 성립한다고 하자. 이제 위의 &lt;b&gt;시행&lt;/b&gt;을 거쳐서 만든 간선이 cut에 있을 확률을 계산하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 정점 $(v, S)$에 대해, $l(v) \in S$인 정점들을 cut으로 보고, &lt;b&gt;시행&lt;/b&gt;을 반복하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번과 2번 과정에서, $uv$와 $uw$가 unsatisfied vertex일 확률이 각각 $\varepsilon$ 이하이니 최소한 $1 - 2\varepsilon$ 이상의 확률로 $l(u) = \pi(l(v)) = \pi(l(w))$가 성립한다. ($\pi$의 아래첨자는 의미상 명확한 경우 생략한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번과 4번 과정에서, $l(u)$가 한쪽에만 들어있는 $S, T$를 고르게 될 확률이 $\frac{1 - \rho}{2}$가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 5번 과정을 통해 변환하고 나면, $l(v) \in S$, $l(w) \in T$ 중 하나만 성립할 확률도 똑같이 $\frac{1 - \rho}{2}$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 시행에서 cut에 들어있는 간선을 뽑을 확률은 최소한 $(1 - 2\varepsilon)\frac{1 - \rho}{2}$ 이상이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Soundness Proof&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해하는 데 가장 시간을 많이 쓴 부분이고, 사실 아직 완전히 이해하지도 못했다. discrete fourier analysis라는 키워드가 많이 등장하는데 아직 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표는 $\frac{\cos^{-1} \rho}{\pi} + \varepsilon^{\prime}$ 이상의 max cut assignment를 $\varepsilon$ 이상의 satisfying label을 주는 적절한 $\varepsilon$ 값을 찾는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f_{v}(S) : 2^{[k]} \to \{-1, 1\}$를 정점 $(v, S)$의 max cut labeling이라고 하자. Integer LP와 비슷하게, 이 때 cut value는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\mathrm{val} = \frac{1}{2}\mathbb{E}_{u, v, w, S, T} \left[ 1 - f_{v}(\pi(S))f_{w}(\pi(T)) \right]$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 될 것이다. 기댓값 연산자는 &lt;b&gt;시행&lt;/b&gt;의 distribution에 따른 것으로, 독립인 부분을 묶어내기 위해 $h_{u}(S) = \mathbb{E}_{v \in N(u)} f_{v}(\pi(S))$로 정의하자. $h_{u} : 2^{[k]} \to [-1, 1]$임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\mathrm{val} = \frac{1}{2}\left(1 - \mathbb{E}_{S, T} [h_{u}(S)h_{u}(T)]\right)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 정리된다. 이 때 $\mathcal{S}_{\rho}(h_{u}) := \mathbb{E}_{S, T} [h_{u}(S)h_{u}(T)]$를 $h_{u}$의 stability로 정의한다. 어떤 $S$에 대해 $\frac{1 - \rho}{2}$의 확률로 원소를 변조했을 때 자신과의 correlation이 얼마나 유지되는지를 나타낸 값으로 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 $\mathrm{val} = \frac{1}{2}(1 - \mathbb{E}_{u} [ \mathcal{S}_{\rho}(h_{u}) ])$가 된다. 그런데 $\mathrm{val} \ge \frac{\cos^{-1}\rho}{\pi} + \varepsilon^{\prime}$이므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\mathbb{E}_{u}[ \mathcal{S}_{\rho}(h_{u}) ] \le 1 - \frac{2\cos^{-1}\rho}{\pi} - 2\varepsilon^{\prime}$이 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것만으로는 아무것도 안 나오고, 새로운 개념을 정의해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Majority is Stablest Theorem and its variants&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 증명하지 않을 거기 때문에 설명이 다소 거칠다. 추후에 이해가 쌓이면 다시 다루는 것으로..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f : 2^{[n]} \to \pm 1$에 대해, $i \in [n]$의 &lt;b&gt;influence&amp;nbsp;&lt;/b&gt;$\mathrm{Inf}_{i}(f) = \Pr[f(S) \neq f(S \oplus i)]$로 정의한다. 여기서 $S \oplus i$는 $i$가 $S$에 속하는 경우 빼고, 속하지 않는 경우 넣어주는 대칭차집합을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임의의 함수 $f, g : 2^{[n]} \to \mathbb{R}$에 대해 내적 $\left&amp;lt; f, g \right&amp;gt; = \mathbb{E} [fg] = \frac{1}{2^n} \sum_{S} f(S)g(S)$로 정의하자. 이 때 $f$의 fourier coefficient 를 $\hat{f}(S) = \frac{1}{2^n} \sum_{T} (-1)^{\lvert S - T \rvert} f(T)$로 정의하면, 몇 가지 성질이 성립함을 알 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\left&amp;lt; f, g \right&amp;gt; = \sum_{S} \hat{f}(S)\hat{g}(S)$.&lt;/li&gt;
&lt;li&gt;특히 $f : 2^{[n]} \to \pm 1$인 경우, $\mathrm{Inf}_{i}(f) = \sum_{i \in S} \hat{f}(S)^{2}$.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 일반적인 함수에 대한 influence는 $\sum_{i \in S} \hat{f}(S)^{2}$로 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(S) = (-1)^{\lvert S \rvert}$와 같은 parity function의 경우, 모든 $i$에 대해 $\mathrm{Inf}_{i}(f) = 1$로 높은 influence를 가지고 있다. majority is stablest theorem은 influence에 대한 global bound가 있다면 stability에 대한 bound를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Theorem. (Majority is stablest)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f : 2^{[n]} \to [-1, 1]$에 대해, 임의의 $\rho \in [0, 1), \varepsilon &amp;gt; 0$에 대해 다음을 만족하는 $\delta &amp;gt; 0$이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;만약 $\mathbb{E}f = 0$, $\mathrm{Inf}_{i}(f) \le \delta$라면 $\mathcal{S}_{\rho}(f) \le 1 - \frac{2}{\pi}\cos^{-1}\rho + \varepsilon$.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 사용할 버전은 이것의 응용 버전으로, $\rho$의 범위도 다르고 부등호 방향도 다르고 많은 것이 달라서 헷갈리지만 결과만 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\mathrm{Inf}_{i}^{k}(f) := \sum_{i \in S, \lvert S \rvert \le k} \hat{f}(S)^{2}$를 &lt;b&gt;$k$-degree influence of $i$로 정의한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Theorem. (Majority is stablest-variant)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f: 2^{[n]} \to [-1, 1]$에 대해, 임의의 $\rho \in (-1, 0], \varepsilon &amp;gt; 0$에 대해 다음을 만족하는 $\delta &amp;gt; 0$, $k \ge 1$이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;만약 $\mathrm{Inf}_{i}^{k}(f) \le \delta$ 라면 $\mathcal{S}_{\rho}(f) \ge 1 - \frac[2}{\pi}\cos^{-1}\rho - \varepsilon$.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\mathbb{E}f = 0$이라는 조건은 원문에 없다. 특히 우리가 사용할 예시에서는 강제되면 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Soundness Proof (Continued)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 돌고 돌아, $\mathbb{E}_{u}[ \mathcal{S}_{\rho}(h_{u}) ] \le 1 - \frac{2\cos^{-1}\rho}{\pi} - 2\varepsilon^{\prime}$이 성립한다는 사실에서 Majority is stablest의 대우를 생각할 수 있다. Markov's inequality를 사용하면, 최소한 $\frac{\varepsilon^{\prime}}{2}\lvert U \rvert$만큼의 $u$가 $\mathcal{S}_{\rho}(h_{u}) \le 1 - \frac{2\cos^{-1}\rho}{\pi} - \varepsilon^{\prime}$을 만족하고, 각 $u$에 대해서는 Majorist is stablest-variant에 따라 어떤 $j \in [k]$가 존재하여 $\mathrm{Inf}_{j}^{K}(h_{u}) \ge \delta$이다. 우리는 여기서 $l(u) = j$로 labeling하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 잠깐, 왜 influence가 큰 label을 달아주고 싶을까? 간단히 말해 이게 가능한 $V$의 후보를 늘려주기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 label된 $u$들을 $U$-good vertex라고 하자. $U$-good vertex가 아닌 $U$의 나머지 정점들은 아무렇게나 label해줄 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\mathrm{Inf}_{j}^{K}(h_{u}) \ge \delta$에서 좌변을 열심히 전개하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\mathrm{Inf}_{j}^{K}(h_{u}) = \sum_{j \in S, \lvert S \rvert \le K} \hat{h_u}(S)^{2} = \sum_{j \in S, \lvert S \rvert \le K} \mathbb{E}_{v \in N(u)} [\hat{f_{v}}(\pi^{-1}(S))]^{2} \le \sum \mathbb{E} [ \hat{f_v}(\pi(S))^{2}] = \mathbb{E}[ \mathrm{Inf}_{\pi(j)}^{K} (f_v) ] $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 얻는다. $\mathbb{E}[X]^{2} \le \mathbb{E}[X^2]$를 쓰고, 기댓값과 합을 열심히 바꿔쳐주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 $j$의 influence가 크다는 사실만으로, $N(u)$에 $\pi(j)$의 influence가 큰 정점들이 많다는 사실을 확인한 것이다. 역시 Markov's inequality를 통해 최소한 $\frac{\delta}{2}\lvert N(u) \rvert$만큼의 정점 $v$가 $\mathrm{Inf}_{\pi(j)}^{K} (f_v) \ge \frac{\delta}{2}$를 만족함을 알 수 있다. 이러한 정점들을 $V$-good한 정점들이라고 하면 역시 전체의 $\delta/2$ 이상이 $V$-good vertex들이..면 좋겠지만, 여러 $u$에 대해서 하나의 $v$로 이러한 &quot;goodness&quot;가 몰릴 수도 있다. 이 경우 $\pi(j)$ 중 하나로 labeling했을 때 수많은 unsatisfied edge들이 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 $\sum_{i \in [k]} \mathrm{Inf}_{i}^{K} (f_{v}) = \sum_{\lvert S \rvert \le K} \lvert S \rvert \hat{f}(S)^{2} \le K \lVert f \rVert_{2}^{2} \le K$가 성립하므로, 한 정점 $v$에 대해 $U$-good vertex에서 induce되는 $V$-goodness는 최대 $K/(\delta/2) = 2K/\delta$개의 label에만 생긴다. 따라서 이 $2K/\delta$개의 후보 중 아무 label로 $v$를 마킹해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 어떤 간선이 하필 $U$-good vertex $u$와 그 이웃 중 $V$-good vertex $v$여서 labeling에 의해 satisfy될 확률은 $\varepsilon = \frac{\varepsilon'}{2} \cdot \frac{\delta}{2} \cdot \frac{\delta}{2K}$가 된다. $K, \delta$는 $\varepsilon^{\prime}$의 함수로 나타나기 때문에 이로써 soundness의 증명이 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://www.wisdom.weizmann.ac.il/~dinuri/courses/19-inapprox/lec6.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.wisdom.weizmann.ac.il/~dinuri/courses/19-inapprox/lec6.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://arxiv.org/pdf/1211.1001&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/pdf/1211.1001&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://www.designofapproxalgs.com/book.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.designofapproxalgs.com/book.pdf&lt;/a&gt;&lt;/p&gt;</description>
      <category>CS 이론/알고리즘</category>
      <category>approx</category>
      <category>UGC</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/155</guid>
      <comments>https://drugstoreoftamref.tistory.com/155#entry155comment</comments>
      <pubDate>Tue, 28 Jan 2025 22:48:23 +0900</pubDate>
    </item>
    <item>
      <title>Bostan-Mori, Tellegen's Principle, Power series composition</title>
      <link>https://drugstoreoftamref.tistory.com/154</link>
      <description>&lt;h1&gt;Bostan-Mori algorithm&lt;/h1&gt;
&lt;p&gt;흔히 &amp;quot;선형 점화식의 $N$번째 항&amp;quot;을 구하는 알고리즘으로 알려진 방법이다. 사실은 보다 일반적으로, $P(x)/Q(x)$ 꼴의 rational power series의 $N$차항 계수를 구하는 데 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Theorem.&lt;/strong&gt; $\deg P &amp;lt; \deg Q = d$, $Q(0) = 1$을 만족하는 다항식 $P, Q \in \mathbb{F}[x]$ 에 대해, $[x^N]P(x)/Q(x)$를 $\mathcal{M}(d)\log N$ 시간에 계산할 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;어떤 다항식 / power-series의 $N$차항 계수를 $[x^N]f(x)$로 쓴다.&lt;/li&gt;
&lt;li&gt;$\mathcal{M}(d)$는 $\mathbb{F}[x]$의 두 $d$차 다항식을 곱하는 데 걸리는 시간이다. Computer algebra에서는 sublogarithmic factor를 따지지만, PS 범위에서는 $\mathcal{M}(d) = O(d\log d)$로 생각해도 무방하다.&lt;/li&gt;
&lt;li&gt;$\mathbb{F}$는 덧셈, 뺄셈, 곱셈, 나눗셈이 충분히 빠른 어떤 체로 생각한다. $\mathbb{F} _ {p}$로 생각하면 제일 편하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Proof.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;$N=0$이라면 $P(0) / Q(0)$를 계산하면 된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;$N \ge 1$인 경우, 분자 분모에 $Q(-x)$를 곱해 분모를 even function으로 만들고, 분자를 odd-even으로 분리하자. 즉 $P(x)/Q(x) = P(x)Q(-x)/Q(x)Q(-x)$, $P(x)Q(-x) = U_{0}(x^2) + xU_{1}(x^2)$, $Q(x)Q(-x) = V(x^2)$으로 쓴다. 이 때 $$[x^N]P(x)/Q(x) = [x^{\lfloor N/2 \rfloor}] U_{N \bmod 2} (x) / V(x)$$가 성립하고, $\deg U &amp;lt; d = \deg V$이자 $V(0) = 1$이니 재귀적으로 해결할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;따라서 $d$차식 곱셈 $O(\log N)$번으로 전체 문제를 해결할 수 있으니 시간 복잡도는 $O(\mathcal{M}(d) \log N)$이다. $\mathcal{F}$가 $\mathcal{Z} _ {998244353}$과 같이 DFT를 사용하기 좋은 환경인 경우, DFT Doubling을 활용하여 $\frac{2}{3}\mathcal{M}(d)\log N$ 까지 상수를 줄일 수 있음이 알려져 있다. 자세한 내용은 &lt;a href=&quot;https://infossm.github.io/blog/2021/12/21/Bostan-Mori_Algorithm/&quot;&gt;Aeren님의 글&lt;/a&gt;을 참조.&lt;/p&gt;
&lt;p&gt;연습문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13725&quot;&gt;BOJ 13725 RNG&lt;/a&gt; : &amp;quot;선형 점화식의 $N$차항&amp;quot;을 그대로 옮긴 문제이다. $P, Q$를 비교적 쉽게 계산할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13178&quot;&gt;BOJ 13178 목공&lt;/a&gt; : 꼴이 비선형 점화식이지만, 생성함수를 $x / (1-x)f(x)$ 꼴로 적을 수 있고 그 뒤는 Bostan-Mori algorithm을 적용하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Tellegen&amp;#39;s Principle&lt;/h1&gt;
&lt;p&gt;Degree가 각각 $n, m$인 두 다항식 $f, g \in \mathbb{F}[x]$를 곱하는 연산을 생각하자.&lt;br&gt;뜬금없지만, 이를 $(n + m + 1) \times (n+1)$ 행렬 $M _ {g} = ([x^{i-j}]g(x) ) _ {ij}$ 를 $\vec{f} = (f _ 0, \cdots, f _ n)$에 곱하는 행렬 연산으로 볼 수도 있다. ($f = \sum f _ {i} x^{i}, g = \sum g _ {i} x^{i}$로 편의상 표기)&lt;/p&gt;
&lt;p&gt;다시 한 번 뜬금없지만, $M_{g}^{T}$는 어떤 연산자일까? 임의의 크기 $n+m-1$인 벡터 $w = (w_{0}, \cdots, w_{n + m})$를 생각하자. $({M _ {g}}^{T}w) _ {i} = \sum_{j=0}^{n+m} [x^{j-i}]g(x) w _ {j} = \sum_{j=0}^{m} g _ {j} w _ {i + j}$ 가 된다. 즉 $(\vec{g} \cdots w_{0:m}, \cdots \vec{g} \cdots w_{n:n+m})$ 과 같은 convolution 꼴들을 여럿 계산하게 된다.&lt;/p&gt;
&lt;p&gt;사실 convolution과 다항식 곱셈이 비슷한 꼴을 갖는 것이 전혀 놀라운 일은 아니다. 그리고 둘을 계산하는 시간 복잡도가 동일하다는 사실도 잠시 생각해보면 그리 납득하기 어렵지 않다. Tellegen&amp;#39;s principle은 이러한 &amp;quot;동치 관계&amp;quot;에 보다 일반적인 대응을 제시한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thm. (Tellegen&amp;#39;s principle)&lt;/strong&gt; $m \times n$ 행렬 $M$에 대해 $f \mapsto Mf$를 계산하는 프로그램 $L$의 시간 복잡도가 $T_{1}$이라면, $g \mapsto M^{T}g$를 계산하는 $T_{1} - n + m + z_{0} - z_{1}$ 복잡도의 프로그램이 존재한다. 단, $z_0, z_1$은 각각 $M$의 zero row, zero column의 개수이다.&lt;/p&gt;
&lt;p&gt;아무 프로그램이나 되는 것은 아니고, algebraic complexity theory를 하시는 분들의 정의인 &amp;quot;linear straight line program&amp;quot;이어야 한다.&lt;br&gt;간단히 말해, 모든 연산이 $x _ {i} \leftarrow a x _ {j} + b x _ {k}$ 처럼 모든 변수 ($x _ {\ast}$)에 대해 linear한 &amp;quot;단순한&amp;quot; 연산의 나열로 구성된 프로그램이어야 한다.&lt;/p&gt;
&lt;p&gt;Linear Straight line program의 예시로는 Cooley-Tukey DFT (우리가 아는 그 DFT), Karatsuba algorithm 등이 있다.&lt;/p&gt;
&lt;p&gt;당연히 두 변수 $x, y$에 대해 $x \leftarrow ax + by$ 같은 atomic한 연산은 $\begin{pmatrix} a &amp;amp; b \\ 0 &amp;amp; 1 \end{pmatrix}$로 나타날테니, 이 연산의 transpose는 $x \leftarrow ax, y \leftarrow bx + y$와 같이 간단히 쓸 수 있을 것이다. 그리고 $(f \circ g)^{t} = g^{t} \circ f^{t}$일 테니 모든 연산을 역순으로 조립하면 이론상 transposed program을 만들 수는 있다. 하지만 그 이상으로 Tellegen&amp;#39;s principle이 명쾌한 conversion을 제공하진 않으며, 주로 몇 가지 building block들을 조합하여 transposed program을 만든다. &lt;a href=&quot;%5Bhttps://dl.acm.org/doi/pdf/10.1145/860854.860870%5D(https://dl.acm.org/doi/pdf/10.1145/860854.860870&quot;&gt;Tellegen&amp;#39;s principle into practice&lt;/a&gt;에서 polynomial division, polynomial multiplication 등 자주 쓰이는 연산에 대한 transposed program을 계산해두었다.&lt;/p&gt;
&lt;p&gt;서로 transpose 관계인 문제들의 예시들은 아래와 같다. 각각은 input vector $f$ (혹은 polynomial)에 대해 linear함에 주의하자. 이외의 변수들에 대해서는 linear하지 않을 수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Primal) &lt;strong&gt;Multipoint Evaluation&lt;/strong&gt; $f \mapsto f(a _ 0), \cdots f(a _ {q-1})$&lt;/li&gt;
&lt;li&gt;(Dual) &lt;strong&gt;Generalized Power Sum&lt;/strong&gt; $(a _ {0}, \cdots, a _ {q-1}) \mapsto \sum_{i=0}^{q-1} a_{i}^{d}$ for $d = 0, \cdots, n$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이건 계산은 안해봤다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;(Primal) &lt;strong&gt;Shift&lt;/strong&gt;: $f(x) \mapsto f(x + 1)$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Dual) &lt;strong&gt;Falling factorial basis&lt;/strong&gt; $\sum f_{j} x^{j} = \sum g_{j} x(x-1)\cdots (x-j+1)$일 때, $f \mapsto g$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Primal) &lt;strong&gt;Modular Composition&lt;/strong&gt;: $f(x) \mapsto f(g(x)) \mod h(x)$. (단, $g(0) = 0$)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Dual) &lt;strong&gt;Power Projection&lt;/strong&gt;: $(w_{0}, \cdots, w_{n-1})$와 다항식 $f$에 대해 $w(f) = \sum_{i} w_{i}f_{i}$로 정의할 때, $w( g(x)^{k} \mod h )$ for $k = 0, \cdots, \deg f$.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Power Series Composition in Near-Linear Time (FOCS &amp;#39;24)&lt;/h1&gt;
&lt;p&gt;주어진 다항식 $f, g, h$에 대해 modular composition $f(g(x)) \mod h(x)$를 계산하는 문제는 computer algebra 전반에 있어 관련성이 깊은 문제이다. 현재 이 문제에 대한 일반적인 near-linear time algorithm은 알려져 있지 않고, $O(n^{1.5})$ 에 동작하는 버전과 빠른 행렬곱에 의존하는 버전이 있는 것으로 알고 있다. (TODO: 참고자료 추가)&lt;/p&gt;
&lt;p&gt;$g(x) = \log(1+x), e^{x} - 1$과 같이 특수한 경우에 대해서는 다른 문제로 formulate한 성과가 있었지만, 이번에 $h(x) = x^{n}$ 이라는, 상당히 일반화된 조건에서 이 문제를 해결한 논문이 발표되었다. 결과도 꽤 간단한 편인데, Bostan-mori algorithm과 Tellegen&amp;#39;s principle을 배경지식으로 알고 있으면 좋다.&lt;/p&gt;
&lt;p&gt;참고로 1저자인 &lt;a href=&quot;https://codeforces.com/profile/noshi91&quot;&gt;Yasunori Kinoshita&lt;/a&gt;는 2024 ICPC WF에서 4위를 차지하였다. &lt;/p&gt;
&lt;p&gt;논문에서는 Tellegen&amp;#39;s principle에 의한 dual이 되는 Power Projection의 near-linear algorithm을 먼저 제시한다. 이로부터 자연스럽게 modular composition을 near linear time에 해결할 수 있는 셈이다.&lt;/p&gt;
&lt;p&gt;$w^{R}(x) = \sum_{j=0}^{n-1} w_{n-1-j} x^{j}$라고 두자.&lt;/p&gt;
&lt;p&gt;Power projection 문제의 답을 $p_{k} = w( g(x)^{k} \mod x^{n} )$라고 하면,&lt;/p&gt;
&lt;p&gt;$$p_{k} = [x^{n-1}] w^{R}(x) (g(x)^{k} \mod x^{n}) = [x^{n-1}] w^{R}(x) g(x)^{k}$$&lt;br&gt;로 쓸 수 있다. 이제 generating function $\sum p_{k} y^{k}$를 생각하면&lt;/p&gt;
&lt;p&gt;$$\sum_{k} p_{k}y^{k} = \sum_{k} [x^{n-1}] w^{R}(x) y^{k} g(x)^{k} = [x^{n-1}]\frac{ w^{R}(x) }{ 1 - yg(x) } \mod y^{m}$$&lt;/p&gt;
&lt;p&gt;와 같이 쓸 수 있다. 여기서 $m = \deg g$.&lt;/p&gt;
&lt;p&gt;Bostan-mori algorithm의 모든 부분은 division free라는 것을 생각하면, $\mathbb{F}[y][x]$에서도 대부분의 논리를 그냥 가져올 수 있다.&lt;/p&gt;
&lt;p&gt;이변수 다항식의 분수꼴 $P(x, y) / Q(x, y)$의 $[x^{N}]$을 알고 싶다고 하자. 이는 $y$에 대한 다항식일 것이다. 똑같이 $Q(-x, y)$를 분자 분모에 곱해주고 $x$-차수의 기우성에 따라 분리해주면 된다. 이 때 $N$차항보다 더 큰 항은 앞으로 필요없으니 버리고, 재귀적으로 문제를 해결한다.&lt;/p&gt;
&lt;p&gt;물론 이변수 다항식을 그렇게 속편하게 곱할 수는 없다. 다음의 정리를 사용하자.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proposition.&lt;/strong&gt; 두 이변수 다항식 $P(x, y), Q(x, y)$가 모두 $\deg_{x} &amp;lt; m, \deg_{y} &amp;lt; n$를 만족하면, $PQ$를 $O(\mathcal{M}(mn))$ 시간에 계산할 수 있다.&lt;/p&gt;
&lt;p&gt;사실 $y = x^{2m-1}$ 정도로 치환해서 곱해주면 된다. 흔히 Kronecker&amp;#39;s substitution이라고도 부른다.&lt;/p&gt;
&lt;p&gt;이 과정의 시간 복잡도를 $P(x, y) = w^{R}(x)$, $Q(x, y) = 1 - yg(x)$, $N = n-1$에 대해 분석하면, $i$번째 iteration (즉, $N \leftarrow N / 2^{i}$인 시점) 에서는 $\deg_{x}Q \le \min(m-1, n/2^{i}), \deg_{y} Q \le \min(m-1, 2^{i+1})$이 성립한다. 마찬가지로 $\deg_{x} P \le n/2^{i}, \deg_{y} P \le 2^{i+1}$이 성립하므로 $2^{i} \le m$이라면 $i$번째 iteration에서 시간 복잡도는 $\mathcal{M}(n)$이다.&lt;/p&gt;
&lt;p&gt;$2^{i} &amp;gt; m$인 경우, $x$에 대한 차수는 계속 줄어들지만 $y$에 대한 차수가 여전히 $m-1$까지 커질 수 있기 때문에 분석을 따로 해주어야 한다. $m &amp;lt; 2^{i} &amp;lt; n$에 대해 $\mathcal{M}(mn / 2^{i})$만큼의 시간이 들게 되는데 이는 $O(\mathcal{M}(n))$으로 bound 된다.&lt;/p&gt;
&lt;p&gt;따라서 전체 시간 복잡도는 $O(\mathcal{M}(n)\log m)$이다.&lt;/p&gt;
&lt;p&gt;당연히 Tellegen&amp;#39;s principle만으로 이걸 뒤집어서 modular composition을 재현하기는 매우 어렵다. 본문의 4.2절에 직접 composition을 계산하는 부분이 있는데, 위 알고리즘과 대동소이하므로 궁금하신 분들은 일독을 권한다.&lt;/p&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Kinoshita, Yasunori, and Baitian Li. &amp;quot;Power Series Composition in Near-Linear Time.&amp;quot; arXiv preprint arXiv:2404.05177 (2024). &lt;a href=&quot;https://arxiv.org/pdf/2404.05177&quot;&gt;https://arxiv.org/pdf/2404.05177&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bürgisser, Peter, Michael Clausen, and Mohammad A. Shokrollahi. Algebraic complexity theory. Vol. 315. Springer Science &amp;amp; Business Media, 2013. &lt;a href=&quot;https://link.springer.com/book/10.1007/978-3-662-03338-8&quot;&gt;https://link.springer.com/book/10.1007/978-3-662-03338-8&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bostan, Alin, Grégoire Lecerf, and Éric Schost. &amp;quot;Tellegen&amp;#39;s principle into practice.&amp;quot; Proceedings of the 2003 international symposium on Symbolic and algebraic computation. 2003.&lt;a href=&quot;https://dl.acm.org/doi/pdf/10.1145/860854.860870&quot;&gt;https://dl.acm.org/doi/pdf/10.1145/860854.860870&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS 이론/알고리즘</category>
      <category>computer_algebra</category>
      <author>탐렢</author>
      <guid isPermaLink="true">https://drugstoreoftamref.tistory.com/154</guid>
      <comments>https://drugstoreoftamref.tistory.com/154#entry154comment</comments>
      <pubDate>Thu, 23 Jan 2025 00:47:20 +0900</pubDate>
    </item>
  </channel>
</rss>