<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kriptografi on kenji.blog</title><link>http://kenji.blog/id/tags/kriptografi/</link><description>Recent content in Kriptografi on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 05 Sep 2026 13:04:59 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/tags/kriptografi/index.xml" rel="self" type="application/rss+xml"/><item><title>[Bedah Lengkap] Memahami Algoritma Kriptanalisis Terkuat "GNFS" dengan Mengimplementasikannya di C++</title><link>http://kenji.blog/id/p/gnfs-cpp-implementation/</link><pubDate>Sat, 05 Sep 2026 13:04:59 +0900</pubDate><guid>http://kenji.blog/id/p/gnfs-cpp-implementation/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217.jpg" alt="Featured image of post [Bedah Lengkap] Memahami Algoritma Kriptanalisis Terkuat "GNFS" dengan Mengimplementasikannya di C++" />&lt;h1 id="bedah-lengkap-memahami-algoritma-kriptanalisis-terkuat-gnfs-dengan-mengimplementasikannya-di-c">[Bedah Lengkap] Memahami Algoritma Kriptanalisis Terkuat &amp;ldquo;GNFS&amp;rdquo; dengan Mengimplementasikannya di C++
&lt;/h1>&lt;p>&amp;ldquo;Kriptografi RSA&amp;rdquo; mendukung dasar dari internet modern. Kekuatannya bergantung pada keyakinan matematis bahwa &amp;ldquo;memfaktorkan bilangan komposit yang sangat besar menjadi faktor prima secara praktis tidak mungkin dilakukan oleh komputer saat ini&amp;rdquo;.&lt;/p>
&lt;p>Namun, umat manusia tidak pernah menyerah. Saat ini, terdapat ** algoritma terkuat dan paling canggih buatan manusia ** untuk faktorisasi prima besar pada komputer klasik (komputer biasa, bukan komputer kuantum). Ini disebut ** &amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo; **.&lt;/p>
&lt;p>Dalam artikel ini, kami akan merilis secara lengkap kode implementasi C++ (menggunakan integer presisi ganda &lt;code>boost::multiprecision&lt;/code> dari pustaka Boost) yang memodelkan secara ketat logika komputasi canggih dari GNFS ini. Kami juga akan menjelaskan secara mendalam tentang &amp;ldquo;teori bilangan aljabar&amp;rdquo; di baliknya.&lt;/p>
&lt;p>Silakan nikmati misteri matematika dan kekuatan ilmu komputer yang menaklukkannya bersama dengan kode sumbernya.&lt;/p>
&lt;hr>
&lt;h2 id="1-kerangka-logika-canggih-gnfs-kode-sumber-lengkap">1. Kerangka Logika Canggih GNFS (Kode Sumber Lengkap)
&lt;/h2>&lt;p>Pertama, mari kita lihat gambaran keseluruhan implementasi GNFS C++ yang akan kita bahas kali ini. Sistem Number Field Sieve yang sebenarnya (seperti CADO-NFS) adalah sistem terdistribusi raksasa dengan ratusan ribu baris kode. Namun, kode ini dirancang dengan mengekstrak ** &amp;ldquo;5 alur (fase) esensial&amp;rdquo; ** yang membentuk GNFS menjadi kelas-kelas, memodelkannya dalam konfigurasi minimal tanpa kehilangan makna matematisnya.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;span class="lnt">168
&lt;/span>&lt;span class="lnt">169
&lt;/span>&lt;span class="lnt">170
&lt;/span>&lt;span class="lnt">171
&lt;/span>&lt;span class="lnt">172
&lt;/span>&lt;span class="lnt">173
&lt;/span>&lt;span class="lnt">174
&lt;/span>&lt;span class="lnt">175
&lt;/span>&lt;span class="lnt">176
&lt;/span>&lt;span class="lnt">177
&lt;/span>&lt;span class="lnt">178
&lt;/span>&lt;span class="lnt">179
&lt;/span>&lt;span class="lnt">180
&lt;/span>&lt;span class="lnt">181
&lt;/span>&lt;span class="lnt">182
&lt;/span>&lt;span class="lnt">183
&lt;/span>&lt;span class="lnt">184
&lt;/span>&lt;span class="lnt">185
&lt;/span>&lt;span class="lnt">186
&lt;/span>&lt;span class="lnt">187
&lt;/span>&lt;span class="lnt">188
&lt;/span>&lt;span class="lnt">189
&lt;/span>&lt;span class="lnt">190
&lt;/span>&lt;span class="lnt">191
&lt;/span>&lt;span class="lnt">192
&lt;/span>&lt;span class="lnt">193
&lt;/span>&lt;span class="lnt">194
&lt;/span>&lt;span class="lnt">195
&lt;/span>&lt;span class="lnt">196
&lt;/span>&lt;span class="lnt">197
&lt;/span>&lt;span class="lnt">198
&lt;/span>&lt;span class="lnt">199
&lt;/span>&lt;span class="lnt">200
&lt;/span>&lt;span class="lnt">201
&lt;/span>&lt;span class="lnt">202
&lt;/span>&lt;span class="lnt">203
&lt;/span>&lt;span class="lnt">204
&lt;/span>&lt;span class="lnt">205
&lt;/span>&lt;span class="lnt">206
&lt;/span>&lt;span class="lnt">207
&lt;/span>&lt;span class="lnt">208
&lt;/span>&lt;span class="lnt">209
&lt;/span>&lt;span class="lnt">210
&lt;/span>&lt;span class="lnt">211
&lt;/span>&lt;span class="lnt">212
&lt;/span>&lt;span class="lnt">213
&lt;/span>&lt;span class="lnt">214
&lt;/span>&lt;span class="lnt">215
&lt;/span>&lt;span class="lnt">216
&lt;/span>&lt;span class="lnt">217
&lt;/span>&lt;span class="lnt">218
&lt;/span>&lt;span class="lnt">219
&lt;/span>&lt;span class="lnt">220
&lt;/span>&lt;span class="lnt">221
&lt;/span>&lt;span class="lnt">222
&lt;/span>&lt;span class="lnt">223
&lt;/span>&lt;span class="lnt">224
&lt;/span>&lt;span class="lnt">225
&lt;/span>&lt;span class="lnt">226
&lt;/span>&lt;span class="lnt">227
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;cmath&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;map&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;set&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;chrono&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Menggunakan integer presisi ganda Boost.Multiprecision
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// [SOTA GNFS] General Number Field Sieve Kerangka Logika Tercanggih
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Kode ini secara ketat memodelkan 5 alur dari GNFS canggih
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// yang digunakan dalam CADO-NFS dll., sebagai desain kelas C++ (Boost).
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Relation&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Fase 1: Pemilihan Polinomial (Algoritma KleinJung)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Polinomial sisi aljabar f(x)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Polinomial sisi rasional g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Pembuatan polinomial awal berdasarkan ekspansi basis-m (pada kenyataannya menggunakan reduksi basis kisi LLL yang lebih canggih)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 1] Pemilihan Polinomial (Derajat &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;) dimulai...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ekspansi basis-m sederhana (derajat d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// m = N^(1/d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N_copy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Perkiraan m yang sederhana (perkiraan tanpa menggunakan fungsi Boost)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">low&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">high&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">high&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">low&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">resize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; m = &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; f(x) = &amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;x^&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s">&amp;#34; + &amp;#34;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[Fase 1] Selesai.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Fase 2: Lattice Sieving (Penyaringan Kisi)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// GNFS modern tidak menggunakan Line Sieve (Penyaringan Garis), tetapi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// menggunakan Special-q Lattice Sieving oleh Franke-Kleinjung sebagai standar de facto.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rb&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">generate_factor_bases&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 2] Membuat Basis Faktor (Batas Rasional: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">rational_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;, Batas Aljabar: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">algebraic_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;)&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// (Dihilangkan) Pada kenyataannya, pembuatan bilangan prima dan pemfilteran dengan simbol Legendre dilakukan
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 2] Special-q Lattice Sieving aktif...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Implementasi tiruan: Saringan kisi sebenarnya memindai ruang memori ratusan GB dalam blok
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// (a, b) pasangan dipetakan ke kisi (a = i*q + j*...) untuk setiap prima khusus q,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// dan saringan yang memaksimalkan efisiensi cache dijalankan.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Menambahkan satu relasi tiruan untuk demo
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Relation&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">17&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">rational_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">algebraic_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 2] Ditemukan &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; relasi.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Fase 3: Filtering (Pembersihan Singleton dan Penggabungan Clique)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 3] Menyaring Relasi...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Penghapusan singleton (menghapus relasi dengan prima yang muncul hanya sekali)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Penggabungan clique (menggabungkan relasi untuk mengubah matriks jarang menjadi padat)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Pada kenyataannya, algoritma seperti Union-Find digunakan untuk mengompres matriks ratusan juta baris menjadi beberapa juta baris.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 3] Ukuran matriks dikurangi secara optimal.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Fase 4: Aljabar Linier di atas GF(2) (Metode Block Wiedemann)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Dalam lingkungan superkomputer modern, daripada metode Block Lanczos,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// metode Block Wiedemann (Implementasi Coppersmith) yang cocok untuk komputasi terdistribusi digunakan sebagai teknologi mutakhir.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 4] Algoritma Block Wiedemann di atas GF(2) dimulai...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Mengulangi operasi produk antara matriks jarang (sparse) dan vektor,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// menemukan beberapa vektor solusi (kernel) yang memenuhi M * x = 0 mod 2.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Daftar dependensi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Data tiruan
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 4] Ditemukan &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; dependensi linier (kuadrat sempurna).&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Fase 5: Akar Kuadrat Aljabar (Algebraic Square Root)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 5] Komputasi Akar Kuadrat Aljabar...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Komputasi akar kuadrat V dari sisi rasional (operasi bilangan bulat sederhana)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// V = sqrt( prod(a - bm) ) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Komputasi akar kuadrat gamma dari sisi aljabar (Metode Montgomery, dll.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Menemukan elemen gamma dari field aljabar besar O_K dan memetakannya ke dunia nyata dengan homomorfisme phi
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Y = phi(gamma) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Diasumsikan bahwa barisan Karakter Kuadrat (Quadratic Characters) telah ditambahkan di Fase 2 dan 4
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// untuk menghindari hambatan (Obstruction) dari grup kelas ideal dan grup unit.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; Peta homomorfisme phi diterapkan.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Fase 5] Menghitung FPB(V - Y, N)...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// FPB(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[SUKSES] Faktor non-trivial ditemukan: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; Faktor lain: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[GAGAL] Solusi trivial. Mencoba dependensi berikutnya...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Alur Eksekusi Utama
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; [SOTA GNFS] Mesin General Number Field Sieve (Boost C++) &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Bilangan komposit raksasa N yang ingin difaktorkan, seperti RSA-270
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Derajat polinomial (untuk lebih dari 130 digit, biasanya dipilih derajat 5 hingga 6)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Inisialisasi alur
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10000000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20000000&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Batas sebenarnya adalah puluhan hingga ratusan juta
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Filter&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LinearAlgebraGF2&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AlgebraicSquareRoot&lt;/span> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Pemilihan polinomial
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Proses penyaringan (sieve)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">generate_factor_bases&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">poly_select&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. Penyaringan (kompresi matriks)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. Aljabar linier (Pencarian ruang nol di atas GF(2))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. Perhitungan akar kuadrat aljabar dan FPB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="k">auto&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="nl">dep&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">duration&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[Sistem] Alur SOTA GNFS selesai dalam &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; detik.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Lalu, bagaimana kode ini bekerja menghancurkan dinding kriptografi? Kita akan memecah dan menjelaskan algoritma yang cermat dan matematika lanjutan untuk setiap 5 fase.&lt;/p>
&lt;hr>
&lt;h2 id="2-tujuan-akhir-gnfs-x2-equiv-y2-pmod-n">2. Tujuan Akhir GNFS: $X^2 \equiv Y^2 \pmod N$
&lt;/h2>&lt;p>Tidak hanya GNFS, tujuan dari sebagian besar algoritma faktorisasi prima raksasa modern adalah menemukan pasangan non-trivial $(X, Y)$ yang memenuhi persamaan kongruensi berikut:&lt;/p>
$$X^2 \equiv Y^2 \pmod N$$
&lt;p>Persamaan ini berarti &amp;ldquo;sisa pembagian $X^2$ dan $Y^2$ oleh $N$ adalah sama&amp;rdquo;. Jika kita mengubah ini,
$X^2 - Y^2 \equiv 0 \pmod N$
Dengan kata lain, $(X-Y)(X+Y)$ adalah kelipatan $N$.&lt;/p>
&lt;p>Jika $X \not\equiv \pm Y \pmod N$ (solusi non-trivial), maka akan ada &amp;ldquo;pembagi persekutuan yang lebih besar dari 1 dan lebih kecil dari $N$&amp;rdquo; antara $(X-Y)$ dan $N$.
Di sini, jika kita menggunakan Algoritma Euclidean untuk menghitung ** $\gcd(X-Y, N)$ **, kita dapat dengan mudah menemukan faktor prima dari $N$.&lt;/p>
&lt;p>Namun, menemukan $X$ dan $Y$ ini seperti mencari jarum di padang pasir. Oleh karena itu, GNFS mengambil pendekatan jenius dengan mendistribusikan komputasi dengan menciptakan ** dua dunia **: &amp;ldquo;dunia bilangan bulat nyata&amp;rdquo; dan &amp;ldquo;dunia field aljabar polinomial&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="3-fase-1-pemilihan-polinomial-polynomial-selection">3. Fase 1: Pemilihan Polinomial (Polynomial Selection)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// perhitungan m = N^(1/d) dan ekspansi basis-m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Langkah pertama GNFS adalah membuat &amp;ldquo;polinomial ajaib&amp;rdquo; untuk menjembatani dua dunia tersebut.
Untuk bilangan $N$ yang sangat besar, kita memilih bilangan bulat $m$. Biasanya kita memilih agar $m \approx N^{1/d}$ (dalam kode, kita mengasumsikan polinomial derajat $d=6$).&lt;/p>
&lt;p>Kemudian, $N$ diekspansi ke basis $m$, dan polinomial $f(x)$ dibangun menggunakan koefisien tersebut:
&lt;/p>
$$N = c_d m^d + c_{d-1} m^{d-1} + \dots + c_1 m + c_0$$
$$f(x) = c_d x^d + c_{d-1} x^{d-1} + \dots + c_1 x + c_0$$
&lt;p>Polinomial $f(x)$ ini memiliki sifat yang sangat penting yaitu ** &amp;ldquo;jika kita menyubstitusikan $m$ ke variabel $x$, nilainya tepat $N$ ($f(m) = N$)&amp;rdquo; **. Dengan kata lain, $f(m) \equiv 0 \pmod N$.
Polinomial sisi rasional didefinisikan sebagai $g(x) = x - m$.&lt;/p>
&lt;p>Sebagai hasilnya, ** &amp;ldquo;dunia field aljabar $\mathbb{Z}[\alpha]$&amp;rdquo; ** yang diatur oleh akar $\alpha$ dari $f(x)=0$ dan ** &amp;ldquo;dunia rasional (bilangan bulat) $\mathbb{Z}$&amp;rdquo; ** biasa akan terikat kuat oleh &amp;ldquo;Homomorfisme Ring&amp;rdquo; $x \to m$.&lt;/p>
&lt;p>Dalam CADO-NFS termutakhir dan lainnya, algoritma KleinJung dan algoritma reduksi basis kisi LLL digunakan untuk mencari &amp;ldquo;polinomial terbaik $f(x)$&amp;rdquo; di mana koefisien polinomial tidak menjadi terlalu besar, dan bilangan prima cenderung muncul (mudah menjadi mulus) pada langkah selanjutnya, yang memakan waktu pencarian berbulan-bulan.&lt;/p>
&lt;hr>
&lt;h2 id="4-fase-2-special-q-lattice-sieving-penyaringan-kisi-q-khusus">4. Fase 2: Special-q Lattice Sieving (Penyaringan Kisi q-Khusus)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Pasangan (a, b) dipetakan ke kisi untuk setiap bilangan prima khusus q,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// dan saringan (sieve) yang memaksimalkan efisiensi cache dijalankan.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Setelah kedua dunia disiapkan, langkah selanjutnya adalah mencari &amp;ldquo;bilangan mulus (smooth number - bilangan yang hanya terdiri dari faktor prima kecil)&amp;rdquo; di kedua dunia tersebut.
Jumlah pasangan integer $(a, b)$ yang tak terhingga dihasilkan, dan dua nilai berikut dihitung:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Nilai sisi rasional&lt;/strong> : $a - bm$&lt;/li>
&lt;li>&lt;strong>Norma sisi aljabar&lt;/strong> : $b^d f(a/b)$&lt;/li>
&lt;/ol>
&lt;p>Tujuan GNFS adalah mengumpulkan puluhan hingga ratusan juta dari ** &amp;ldquo;pasangan di mana baik nilai sisi rasional maupun aljabar dapat diuraikan sepenuhnya hanya menggunakan faktor prima kecil (Relasi)&amp;rdquo; **.&lt;/p>
&lt;p>Pada GNFS awal, digunakan &amp;ldquo;Line Sieve&amp;rdquo;, di mana pasangan $(a, b)$ disusun pada bidang $xy$ dan dibagi dengan bilangan prima secara berurutan. Namun, metode ini sangat lambat karena menyebabkan banyak cache miss saat mengakses memori.&lt;/p>
&lt;p>Oleh karena itu, kode modern tercanggih menggunakan metode yang disebut ** &amp;ldquo;Special-q Lattice Sieve&amp;rdquo; **.
Sebuah bilangan prima sedang yang cukup besar $q$ ditetapkan, dan hanya pasangan $(a, b)$ di mana &amp;ldquo;nilai sisi aljabar pasti habis dibagi $q$&amp;rdquo; yang dihitung. Pasangan $(a, b)$ yang memenuhi kondisi ini membentuk &amp;ldquo;Lattice (Kisi)&amp;rdquo; di bidang, membuat lompatan alamat yang dihitung konstan, dan sangat pas di cache L1/L2 CPU.
Pengenalan penyaringan kisi ini sangat meningkatkan kecepatan perhitungan GNFS.&lt;/p>
&lt;hr>
&lt;h2 id="5-fase-3-filtering-penyaringan">5. Fase 3: Filtering (Penyaringan)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Penghapusan Singleton (menghapus relasi dengan prima yang muncul hanya 1 kali)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Penggabungan Clique (menggabungkan relasi untuk memadatkan matriks yang jarang)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ratusan juta relasi yang dikumpulkan oleh komputer di seluruh dunia selama beberapa bulan pada Fase 2. Namun, jika kita memasukkannya langsung ke &amp;ldquo;langkah memecahkan sistem persamaan (perhitungan matriks)&amp;rdquo; berikutnya, memori superkomputer akan penuh sesak.&lt;/p>
&lt;p>Oleh karena itu, proses kompresi ekstrem dari matriks yang disebut ** Filtering ** dilakukan.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Penghapusan Singleton (Pembersihan Singularitas)&lt;/strong>
Misalkan sebuah bilangan prima besar $p$ muncul &amp;ldquo;hanya 1 kali&amp;rdquo; dari ratusan juta relasi. Tujuan kita adalah &amp;ldquo;membuat pangkat semua bilangan prima genap (kelipatan 2)&amp;rdquo;, jadi bilangan prima yang hanya muncul 1 kali tidak akan pernah genap.
Oleh karena itu, relasi yang mengandung prima tersebut langsung dihapus (dibersihkan) sebagai &amp;ldquo;sampah yang tidak berguna&amp;rdquo;. Karena hal ini terjadi berantai, ratusan juta baris data akan dipangkas.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Penggabungan Clique (Clique Merging)&lt;/strong>
Selanjutnya, dengan mengalikan (menambahkan) relasi yang berbagi bilangan prima tertentu, matriks yang jarang (sparse) dipadatkan (dikompres) sementara jumlah baris dikurangi (mirip dengan pencarian clique di teori graf).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Melalui pengoptimalan ini, matriks sparse raksasa dikompresi secara dramatis menjadi ukuran yang dapat dihitung.&lt;/p>
&lt;hr>
&lt;h2 id="6-fase-4-aljabar-linier-atas-gf2-metode-block-wiedemann">6. Fase 4: Aljabar Linier atas GF(2) (Metode Block Wiedemann)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Mengulangi perhitungan produk matriks jarang dan vektor,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// dan menemukan beberapa vektor solusi (kernel) untuk M * x = 0 mod 2.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Kini kita tiba di inti teka-teki.
Kita mengalikan relasi yang terkumpul untuk mencari ** &amp;ldquo;kombinasi di mana pangkat semua faktor prima menjadi genap&amp;rdquo; **.&lt;/p>
&lt;p>Secara matematis, menggunakan matriks raksasa $M$ yang elemen-elemennya mewakili &amp;ldquo;genap atau ganjil (yaitu 0 atau 1)&amp;rdquo; dari pangkat setiap prima, dan vektor $x$ yang merepresentasikan relasi mana yang digunakan, kita perlu menyelesaikan vektor $x$ (Null space / Kernel) sehingga:
&lt;strong>$M \cdot x \equiv 0 \pmod 2$&lt;/strong>&lt;/p>
&lt;p>Kita harus memecahkan sistem persamaan sebuah matriks sebesar jutaan baris × jutaan kolom. Eliminasi Gauss konvensional membutuhkan kompleksitas $O(N^3)$, yang berarti perhitungannya takkan selesai hingga alam semesta berakhir.&lt;/p>
&lt;p>Oleh karena itu, implementasi termutakhir menggunakan ** &amp;ldquo;Metode Block Wiedemann&amp;rdquo; **.
Ini adalah jenis metode subruang Krylov yang menemukan solusi melalui iterasi perkalian matriks-vektor, memanfaatkan fakta bahwa matriks $M$ sangat &amp;ldquo;sparse (sebagian besar 0)&amp;rdquo;.
Tidak seperti metode Block Lanczos yang lama, Block Wiedemann secara penuh membagi proses komputasi ke dalam berbagai cluster, menunjukkan kekuatan besar dalam komputasi awan terdistribusi modern maupun superkomputer.&lt;/p>
&lt;hr>
&lt;h2 id="7-fase-5-algebraic-square-root-akar-kuadrat-aljabar-dan-kehancuran-kriptografi">7. Fase 5: Algebraic Square Root (Akar Kuadrat Aljabar) dan Kehancuran Kriptografi
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(...)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Perhitungan akar kuadrat V dari sisi rasional
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Perhitungan akar kuadrat gamma dari sisi aljabar
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// GCD(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Melalui perhitungan matriks di Fase 4, kita mendapatkan himpunan relasi $S$ yang &amp;ldquo;jika dikalikan, semua faktor primanya akan berpangkat genap&amp;rdquo;.
Dengan ini, kita dapat menyusun &amp;ldquo;kuadrat&amp;rdquo; pada masing-masing dunia rasional dan aljabar.&lt;/p>
&lt;p>Karena sisi rasional hanyalah perkalian bilangan bulat, akar kuadrat $V$ mudah dihitung.
&lt;/p>
$$V^2 = \prod_{S} (a - bm)$$
&lt;p>&lt;strong>Namun, neraka sesungguhnya terletak di &amp;ldquo;sisi aljabar&amp;rdquo;.&lt;/strong>
Di dunia field aljabar $\mathbb{Z}[\alpha]$, keunikan faktorisasi prima tidak berlaku, maka komputasi dilakukan menggunakan ideal. Perhitungan matriks hanya memastikan itu ** &amp;ldquo;menjadi kuadrat sebuah ideal&amp;rdquo;, tetapi tidak &amp;ldquo;menjamin bahwa ia merupakan kuadrat dari sebuah elemen ($\gamma^2$)&amp;rdquo; **.&lt;/p>
&lt;p>Di sinilah hambatan (Obstruction) kuat teori bilangan aljabar menghalangi, yang disebut &amp;ldquo;Hambatan Grup Kelas Ideal&amp;rdquo; dan &amp;ldquo;Hambatan Grup Unit&amp;rdquo;.
GNFS menembus dinding ini dengan menggunakan keajaiban yang disebut ** &amp;ldquo;Karakter Kuadrat (Quadratic Characters)&amp;rdquo; **.
Ke dalam matriks Fase 4, kita diam-diam menambahkan beberapa kolom residu kuadrat (Simbol Legendre) untuk beberapa puluh ideal prima khusus sebelumnya. Berkat hal ini, himpunan $S$ yang ditemukan akan lolos dari hambatan dengan probabilitas sangat tinggi, dan berhasil membentuk &amp;ldquo;kuadrat elemen sejati $\gamma^2$&amp;rdquo;.&lt;/p>
&lt;p>Tugas menemukan $\gamma$ (Akar Kuadrat Aljabar) dihitung dengan menggunakan algoritma yang sangat kompleks seperti Metode Montgomery.&lt;/p>
&lt;p>Dan pada akhirnya, akar kuadrat aljabar $\gamma$ di-warp ke dunia nyata oleh homomorfisme ring $\phi$ (mensubstitusikan $m$ ke $x$), untuk memperoleh $Y$.
Dengan menetapkan $V$ di sisi rasional sebagai $X$, maka persamaan mutlak yang kita cari pun sempurna terbentuk.&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Yang tersisa hanyalah menghitung $\gcd(X-Y, N)$. Hanya dalam 0,001 detik, ketika faktor non-trivial tercetak di layar, Kriptografi RSA yang dianggap tak tergoyahkan hancur sepenuhnya.&lt;/p>
&lt;hr>
&lt;h2 id="kesimpulan">Kesimpulan
&lt;/h2>&lt;p>GNFS bukan sekadar teknik pemrograman.
Ini adalah mahakarya intelijen umat manusia yang menaklukkan &amp;ldquo;kedalaman matematika murni&amp;rdquo; seperti aljabar abstrak, teori ring, dan grup kelas ideal menggunakan &amp;ldquo;teknik tingkat tinggi&amp;rdquo; seperti arsitektur terdistribusi superkomputer dan optimasi cache.&lt;/p>
&lt;p>Informasi chat atau kartu kredit kita yang biasa kita kirim setiap hari, ternyata dilindungi oleh pertempuran matematis yang sangat besar seperti ini.&lt;/p>
&lt;p>Kami berharap melalui kerangka C++ ini, Anda bisa merasakan &amp;ldquo;romantisme matematika dan komputer&amp;rdquo; di balik algoritma pemecahan kode yang mutakhir.&lt;/p></description></item><item><title>Struktur Matematis Sejati dari General Number Field Sieve (GNFS)</title><link>http://kenji.blog/id/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</link><pubDate>Sat, 05 Sep 2026 02:26:13 +0900</pubDate><guid>http://kenji.blog/id/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</guid><description>&lt;img src="http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523.jpg" alt="Featured image of post Struktur Matematis Sejati dari General Number Field Sieve (GNFS)" />&lt;h1 id="struktur-matematis-sejati-dari-general-number-field-sieve-gnfs">Struktur Matematis Sejati dari General Number Field Sieve (GNFS)
&lt;/h1>&lt;p>Tujuan akhir dari GNFS adalah menemukan $X, Y$ sedemikian rupa sehingga $X^2 \equiv Y^2 \pmod N$.
Untuk mencapai ini, para matematikawan membangun sebuah jembatan antara &lt;strong>&amp;ldquo;dunia bilangan bulat nyata&amp;rdquo;&lt;/strong> dan &lt;strong>&amp;ldquo;dunia medan aljabar&amp;rdquo;&lt;/strong>. Jembatan tersebut adalah &amp;ldquo;homomorfisme&amp;rdquo;.&lt;/p>
&lt;h2 id="tahap-1-homomorfisme-homomorphism-yang-menghubungkan-dunia">Tahap 1: &amp;ldquo;Homomorfisme&amp;rdquo; (Homomorphism) yang Menghubungkan Dunia
&lt;/h2>&lt;h3 id="1-pemilihan-polinomial-dan-definisi-akar">1. Pemilihan Polinomial dan Definisi Akar
&lt;/h3>&lt;p>Untuk sebuah bilangan komposit raksasa $N$, kita memilih sebuah bilangan bulat $m$ dan polinomial $f(x)$ sedemikian rupa sehingga $f(m) \equiv 0 \pmod N$.
(Contoh: Ekspansi $N$ dalam basis $m$, dan buat $f(x)$ dari koefisien-koefisiennya. Dalam hal ini, $f(x)$ diasumsikan tak tereduksi di atas medan bilangan rasional $\mathbb{Q}$).&lt;/p>
&lt;p>Selanjutnya, misalkan $\alpha$ adalah salah satu &amp;ldquo;akar bilangan kompleks&amp;rdquo; dari persamaan $f(x) = 0$.
Tentu saja, $f(\alpha) = 0$. $\alpha$ bukanlah bilangan bulat, melainkan bilangan kompleks (bilangan aljabar) yang dapat memuat akar atau bilangan imajiner.&lt;/p>
&lt;h3 id="2-konstruksi-cincin-ring-dan-homomorfisme">2. Konstruksi Cincin (Ring) dan Homomorfisme
&lt;/h3>&lt;p>Di sini, kita menyiapkan dua &amp;ldquo;cincin&amp;rdquo; matematis (dunia di mana penjumlahan dan perkalian didefinisikan):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dunia A: $\mathbb{Z}[\alpha]$&lt;/strong> (Cincin bilangan bulat aljabar yang mengandung $\alpha$)
Ini adalah dunia bilangan yang diekspresikan dalam bentuk $a + b\alpha + c\alpha^2 + \dots$.&lt;/li>
&lt;li>&lt;strong>Dunia B: $\mathbb{Z}/N\mathbb{Z}$&lt;/strong> (Cincin sisa pembagian dengan $N$)
Dunia kongruensi (modulo) yang hanya terdiri dari bilangan bulat dari $0$ hingga $N-1$.&lt;/li>
&lt;/ul>
&lt;p>Di sini, kita mendefinisikan sebuah pemetaan (mapping) $\phi$ dari Dunia A ke Dunia B sebagai berikut:
&lt;strong>$$\phi : \mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z}$$&lt;/strong>
&lt;strong>$$\phi(\alpha) = m \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Pemetaan $\phi$ ini adalah operasi magis yang sepenuhnya menukar variabel $\alpha$ di Dunia A dengan bilangan bulat $m$ di Dunia B.
$\phi$ ini memiliki sifat yang sangat kuat yang disebut &lt;strong>&amp;ldquo;Homomorfisme Cincin&amp;rdquo; (Ring Homomorphism)&lt;/strong>.
Homomorfisme adalah sifat &lt;strong>&amp;ldquo;berpindah ke dunia lain tanpa merusak struktur penjumlahan dan perkalian&amp;rdquo;&lt;/strong>. Artinya, persamaan berikut berlaku:&lt;/p>
&lt;ul>
&lt;li>$\phi(X \times Y) = \phi(X) \times \phi(Y)$&lt;/li>
&lt;li>$\phi(X^2) = \phi(X)^2$&lt;/li>
&lt;/ul>
&lt;p>Apa arti semua ini? Jika kita dapat membuat &lt;strong>&amp;ldquo;bentuk kuadrat&amp;rdquo; ($\gamma^2$)&lt;/strong> dari elemen kompleks $\gamma$ di &amp;ldquo;Dunia A&amp;rdquo; (dunia $\alpha$), kita dapat melompat ke &amp;ldquo;Dunia B&amp;rdquo; (dunia sisa) dengan $\phi$, dan &lt;strong>bentuk kuadrat $\phi(\gamma)^2$ akan dipertahankan dengan sempurna&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="tahap-2-runtuhnya-faktorisasi-prima-dan-lahirnya-ideal">Tahap 2: Runtuhnya Faktorisasi Prima dan Lahirnya &amp;ldquo;Ideal&amp;rdquo;
&lt;/h2>&lt;p>Kita ingin mengumpulkan banyak elemen $(a - b\alpha)$ yang sesuai dalam Dunia A ($\mathbb{Z}[\alpha]$) dan mengalikannya bersama untuk membuat &amp;ldquo;kuadrat sempurna&amp;rdquo; (elemen kuadrat).
Biasanya, kita dapat melakukan &amp;ldquo;faktorisasi prima&amp;rdquo; pada $(a - b\alpha)$ yang dikumpulkan, dan menggabungkannya sehingga semua pangkat bilangan prima menjadi genap (dipecahkan menggunakan matriks) untuk menghasilkan bentuk kuadrat.&lt;/p>
&lt;p>&lt;strong>Namun, di sinilah tembok keputusasaan aljabar menghalangi jalan.&lt;/strong>
Di dunia medan aljabar seperti $\mathbb{Z}[\alpha]$, &lt;strong>&amp;ldquo;keunikan faktorisasi prima (setiap bilangan dapat dinyatakan hanya dengan satu cara sebagai perkalian bilangan prima)&amp;rdquo;&lt;/strong> yang kita pelajari di sekolah menengah &lt;strong>runtuh sama sekali&lt;/strong>.&lt;/p>
&lt;p>(Contoh: Di beberapa dunia medan aljabar, $6 = 2 \times 3$, dan pada saat yang sama $6 = (1+\sqrt{-5}) \times (1-\sqrt{-5})$, sehingga mustahil untuk mengetahui mana yang merupakan bilangan prima sejati).&lt;/p>
&lt;p>Jika faktorisasi prima tidak unik, teka-teki &amp;ldquo;menghitung bilangan prima hingga jumlahnya genap&amp;rdquo; (metode saringan) pada prinsipnya tidak dapat dijalankan.&lt;/p>
&lt;h3 id="keselamatan-dari-kummer-dan-dedekind-ideal">Keselamatan dari Kummer dan Dedekind: &amp;ldquo;Ideal&amp;rdquo;
&lt;/h3>&lt;p>Keruntuhan ini diselamatkan oleh konsep &lt;strong>&amp;ldquo;Ideal&amp;rdquo; (Bilangan Ideal)&lt;/strong> yang diciptakan oleh matematikawan abad ke-19.
Alih-alih melihat elemen itu sendiri, dengan mempertimbangkan &amp;ldquo;himpunan kelipatan (ideal)&amp;rdquo; yang dihasilkan oleh elemen tersebut, faktorisasi prima menjadi mungkin kembali.&lt;/p>
&lt;p>Dalam cincin bilangan bulat dari medan aljabar $\mathcal{O}_K$ (cincin yang lebih sempurna yang mengandung $\mathbb{Z}[\alpha]$), bahkan jika elemen tidak dapat difaktorkan secara unik, terbukti bahwa &lt;strong>&amp;ldquo;Ideal selalu dapat difaktorkan secara unik sebagai hasil kali &amp;lsquo;Ideal Prima&amp;rsquo; ($\mathfrak{p}$)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Oleh karena itu, di GNFS, alih-alih memfaktorkan elemen $(a - b\alpha)$ itu sendiri, kita melakukan &lt;strong>faktorisasi ideal prima pada ideal utama $\langle a - b\alpha \rangle$&lt;/strong> yang dihasilkannya.&lt;/p>
&lt;hr>
&lt;h2 id="tahap-3-norma-norm-dan-dua-saringan-sieve">Tahap 3: Norma (Norm) dan Dua Saringan (Sieve)
&lt;/h2>&lt;p>Lalu, bagaimana kita tahu ke ideal prima mana ideal $\langle a - b\alpha \rangle$ terurai?
Di sini kita menggunakan sebuah fungsi yang disebut &lt;strong>&amp;ldquo;Norma&amp;rdquo; (Norm)&lt;/strong>. Norma adalah fungsi yang mengubah elemen kompleks dari medan aljabar menjadi &amp;ldquo;bilangan bulat biasa $\mathbb{Z}$&amp;rdquo; di dunia nyata.&lt;/p>
&lt;p>Norma dari elemen $(a - b\alpha)$ dihitung dengan polinomial sederhana $b^d f(a/b)$ (di mana $d$ adalah derajat $f(x)$).&lt;/p>
&lt;p>Berdasarkan teorema aljabar, diketahui bahwa &lt;strong>&amp;ldquo;jika norma suatu ideal dapat difaktorkan sepenuhnya oleh bilangan prima kecil (halus), maka ideal aslinya juga dapat difaktorkan sepenuhnya oleh ideal prima kecil&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Oleh karena itu, GNFS secara bersamaan menghitung dua hal berikut untuk sejumlah besar pasangan bilangan bulat $(a, b)$, dan hanya mengumpulkan pasangan di mana keduanya adalah &amp;ldquo;bilangan halus&amp;rdquo;:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Saringan Rasional (Rational Sieve)&lt;/strong>: $a - bm$ (nilai di dunia nyata)&lt;/li>
&lt;li>&lt;strong>Saringan Aljabar (Algebraic Sieve)&lt;/strong>: $b^d f(a/b)$ (norma di dunia medan aljabar)&lt;/li>
&lt;/ol>
&lt;p>Kita mengumpulkan puluhan juta pasangan $(a, b)$ yang keduanya halus, memecahkan data faktorisasi prima ideal (berapa banyak ideal prima yang ada) sebagai matriks raksasa (aljabar linear atas GF(2)), dan menemukan himpunan $S$ dari pasangan sedemikian rupa sehingga &amp;ldquo;ketika dikalikan, pangkat semua ideal prima menjadi genap&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="tahap-4-dua-rintangan-dan-grup-kelas-ideal">Tahap 4: Dua &amp;ldquo;Rintangan&amp;rdquo; dan Grup Kelas Ideal
&lt;/h2>&lt;p>Melalui perhitungan matriks, kita menemukan bahwa mengalikan semua ideal $(a - b\alpha)$ dalam himpunan $S$ menghasilkan kuadrat dari suatu ideal $I$.
&lt;/p>
$$\prod_{S} \langle a - b\alpha \rangle = I^2$$
&lt;p>&lt;strong>Namun, ini belum berakhir. Tembok matematika terdalam dan tersulit di GNFS ada di sini.&lt;/strong>&lt;/p>
&lt;p>Apa yang pada akhirnya kita inginkan bukanlah &amp;ldquo;kuadrat dari ideal&amp;rdquo;, melainkan &lt;strong>&amp;ldquo;kuadrat dari elemen&amp;rdquo; ($\gamma^2$)&lt;/strong> untuk disubstitusikan ke dalam pemetaan $\phi$.
Hanya karena ideal dikuadratkan, tidak berarti elemen itu sendiri dikuadratkan. Ada &lt;strong>dua rintangan matematika yang sangat kuat (Obstructions)&lt;/strong> di sini.&lt;/p>
&lt;h3 id="rintangan-1-tembok-grup-kelas-ideal-ideal-class-group">Rintangan 1: Tembok Grup Kelas Ideal (Ideal Class Group)
&lt;/h3>&lt;p>Ideal $I$ tidak selalu &amp;ldquo;ideal yang dihasilkan oleh satu elemen (ideal utama)&amp;rdquo;.
Mustahil untuk mengekstrak elemen spesifik $\gamma$ dari ideal yang bukan merupakan ideal utama.&lt;/p>
&lt;p>Di sinilah konsep &lt;strong>&amp;ldquo;Grup Kelas Ideal (Class Group, $Cl_K$)&amp;rdquo;&lt;/strong> muncul. Grup Kelas Ideal adalah sebuah grup yang mengukur &amp;ldquo;berapa banyak ideal non-utama yang ada di dunia medan aljabar (seberapa banyak keunikan faktorisasi prima telah rusak)&amp;rdquo;.
Bahkan jika $\prod \langle a - b\alpha \rangle$ menjadi $I^2$, jika $I$ bukan elemen identitas (ideal utama) dalam grup kelas ideal, kita tidak dapat menariknya kembali menjadi kuadrat elemen.&lt;/p>
&lt;h3 id="rintangan-2-tembok-grup-unit-unit-group">Rintangan 2: Tembok Grup Unit (Unit Group)
&lt;/h3>&lt;p>Misalkan kita beruntung dan $I$ adalah ideal utama $\langle \gamma \rangle$.
Maka, $\prod \langle a - b\alpha \rangle = \langle \gamma^2 \rangle$.
Anda mungkin berpikir, &amp;ldquo;Bagus, elemennya juga kuadrat!&amp;rdquo;, tetapi Anda salah besar.&lt;/p>
&lt;p>Fakta bahwa ideal (himpunan kelipatan) sama tidak berarti bahwa elemen-elemennya sepenuhnya sama. Akan selalu ada pergeseran berupa &lt;strong>&amp;ldquo;Unit&amp;rdquo; (bilangan yang kebalikannya juga berupa bilangan bulat, seperti 1 atau -1)&lt;/strong>.
Dengan kata lain, persamaan elemen yang sebenarnya adalah sebagai berikut:
&lt;/p>
$$\prod_{S} (a - b\alpha) = u \cdot \gamma^2$$
&lt;p>
(di mana $u$ adalah elemen dari grup unit $U_K$)&lt;/p>
&lt;p>Kecuali unit $u$ ini sendiri adalah kuadrat dari sesuatu (elemen kuadrat), sisi kiri tidak akan pernah bisa menjadi &amp;ldquo;kuadrat elemen yang sempurna&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="tahap-5-sihir-adleman-karakter-kuadratik-quadratic-characters">Tahap 5: Sihir Adleman &amp;ldquo;Karakter Kuadratik&amp;rdquo; (Quadratic Characters)
&lt;/h2>&lt;p>Rintangan grup kelas ideal dan rintangan grup unit. Bagaimana kita mengatasi keduanya?
Di sinilah muncul metode jenius yang disebut &lt;strong>&amp;ldquo;Karakter Kuadratik&amp;rdquo; (Quadratic Characters)&lt;/strong>, yang diperkenalkan oleh kriptografer Leonard Adleman (huruf &amp;ldquo;A&amp;rdquo; di RSA) dan rekan-rekannya.&lt;/p>
&lt;p>Untuk menentukan apakah &amp;ldquo;suatu elemen benar-benar kuadrat sempurna di medan aljabar&amp;rdquo;, kita menggunakan versi medan aljabar dari simbol Legendre (residu kuadrat).
Pada matriks raksasa tadi (teka-teki untuk membuat jumlah ideal prima genap), kita secara diam-diam menambahkan beberapa lusin kondisi tambahan (kolom) yang menyatakan bahwa &lt;strong>&amp;ldquo;karakter kuadratik untuk beberapa ideal prima khusus $\mathfrak{q}$ juga semuanya menjadi $1$ (genap)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Ketika kita menemukan himpunan $S$ yang memenuhi kondisi tambahan ini melalui perhitungan matriks, sebuah teorema mendalam dari teori bilangan aljabar menjamin bahwa &lt;strong>&amp;ldquo;baik rintangan grup kelas ideal maupun rintangan grup unit secara alami akan hilang dengan probabilitas yang sangat tinggi&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Dengan ini, kita akhirnya mendapatkan persamaan yang sebenarnya:
&lt;/p>
$$\prod_{S} (a - b\alpha) = \gamma^2$$
&lt;hr>
&lt;h2 id="tahap-akhir-penyatuan-dunia-dan-keruntuhan-kriptografi">Tahap Akhir: Penyatuan Dunia dan Keruntuhan Kriptografi
&lt;/h2>&lt;p>Akhirnya, semua potongan teka-teki sudah lengkap.&lt;/p>
&lt;p>&lt;strong>[Elemen di Dunia Medan Aljabar (Dunia A)]&lt;/strong>
$\gamma^2 = \prod (a - b\alpha)$
(Gunakan algoritma akar kuadrat untuk menemukan $\gamma$)&lt;/p>
&lt;p>&lt;strong>[Elemen di Dunia Nyata (Dunia Rasional)]&lt;/strong>
$V^2 = \prod (a - bm)$
(Ini hanyalah perkalian bilangan bulat biasa, jadi akar kuadrat $V$ dapat ditemukan dengan mudah)&lt;/p>
&lt;p>Sekarang, saatnya jembatan ajaib pertama yang kita buat, &lt;strong>homomorfisme $\phi$&lt;/strong>, beraksi.
Kita melompati elemen $\gamma$ dari Dunia A ke Dunia B (dunia sisa $N$) menggunakan $\phi$ (pemetaan yang menyubstitusikan $m$ ke dalam $\alpha$).
&lt;/p>
$$Y = \phi(\gamma) \pmod N$$
&lt;p>Di sisi lain, kita membawa $V$ yang dibuat di dunia nyata langsung ke dunia sisa dan menyebutnya $X$.
&lt;/p>
$$X = V \pmod N$$
&lt;p>Berkat sifat &amp;ldquo;mempertahankan struktur&amp;rdquo; dari homomorfisme, hubungan kuadrat yang berlaku di Dunia A dipertahankan dengan sempurna di Dunia B (dunia modulo $N$).
Lebih jauh lagi, karena pasangan asli $(a, b)$ dibentuk dengan cara yang berkorespondensi sebagai $a - b\alpha$ dan $a - bm$, $X$ dan $Y$ ini saling bertabrakan di dunia modulo $N$ dan menghasilkan persamaan absolut berikut:&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Sekarang, tinggal berdoa agar $X$ dan $Y$ bukan merupakan solusi trivial ($X \equiv \pm Y$), lalu kita hitung:
&lt;strong>$\gcd(X - Y, N)$&lt;/strong>&lt;/p>
&lt;p>Jika itu adalah solusi non-trivial, algoritma Euclidean akan melesat dalam 0,001 detik, dan bilangan prima rahasia $p$ dan $q$, yang merupakan jantung kriptografi RSA, akan dicetak di layar keluaran.&lt;/p>
&lt;hr>
&lt;p>Inilah bentuk utuh dari &lt;strong>&amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo;&lt;/strong> yang mengumpulkan intisari matematika modern.&lt;/p></description></item><item><title>Apa Itu Matematika Terkuat Umat Manusia 'General Number Field Sieve (GNFS)' yang Membobol Kriptografi Internet?</title><link>http://kenji.blog/id/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</link><pubDate>Sat, 05 Sep 2026 02:09:08 +0900</pubDate><guid>http://kenji.blog/id/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485.jpg" alt="Featured image of post Apa Itu Matematika Terkuat Umat Manusia 'General Number Field Sieve (GNFS)' yang Membobol Kriptografi Internet?" />&lt;h1 id="apa-itu-matematika-terkuat-umat-manusia-general-number-field-sieve-gnfs-yang-membobol-kriptografi-internet">Apa Itu Matematika Terkuat Umat Manusia &amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo; yang Membobol Kriptografi Internet?
&lt;/h1>&lt;p>Internet yang kita gunakan setiap hari. Semua komunikasi, seperti pesan LINE, YouTube, dan belanja di Amazon, dilindungi oleh &amp;ldquo;kriptografi&amp;rdquo;.
Saat ini, kriptografi yang paling banyak digunakan di dunia adalah &amp;ldquo;Sandi RSA&amp;rdquo;.&lt;/p>
&lt;p>Inti dari pertahanan Sandi RSA sangatlah sederhana. Ia memanfaatkan sifat matematika bahwa &lt;strong>&amp;ldquo;faktorisasi prima dari angka yang sangat besar tidak dapat dipecahkan bahkan oleh komputer sekalipun&amp;rdquo;&lt;/strong> .
Sebagai contoh, untuk &amp;ldquo;15&amp;rdquo;, kita langsung tahu bahwa itu adalah &amp;ldquo;3 × 5&amp;rdquo;, tetapi saat angkanya menjadi &amp;ldquo;270 digit&amp;rdquo;, menggabungkan seluruh superkomputer di dunia pun akan memakan waktu ratusan juta tahun untuk memecahkannya.&lt;/p>
&lt;p>Namun, para matematikawan tidak tinggal diam. Untuk menembus pertahanan sandi yang tak tertembus ini, umat manusia telah menciptakan sebuah algoritma (prosedur perhitungan) ajaib yang disebut &lt;strong>&amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Dalam artikel ini, tanpa menggunakan istilah teknis sama sekali, hanya dengan pengetahuan &lt;strong>matematika sekolah menengah pertama (faktorisasi prima, aljabar, faktor persekutuan terbesar)&lt;/strong> , kami akan menjelaskan langkah demi langkah secara lengkap bagaimana &amp;ldquo;algoritma terkuat umat manusia&amp;rdquo; ini memecahkan sandi!&lt;/p>
&lt;hr>
&lt;h2 id="bab-1-tujuan-dekripsi-adalah-rumus-kelas-3-smp">Bab 1: Tujuan Dekripsi adalah &amp;ldquo;Rumus Kelas 3 SMP&amp;rdquo;
&lt;/h2>&lt;p>Jurus andalan terbesar untuk menghadapi faktorisasi prima angka raksasa. Itu adalah rumus yang dipelajari di kelas 3 SMP ini.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>$X^2 - Y^2 = (X + Y)(X - Y)$&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Mungkin Anda berpikir, &amp;ldquo;Hah, rumus dasar seperti ini bisa memecahkan sandi?&amp;rdquo;. Namun, inilah kunci utama yang mengungkap segalanya.&lt;/p>
&lt;p>Tujuan utama untuk memecahkan sandi adalah, terhadap angka raksasa $N$, menemukan &lt;strong>&amp;ldquo;angka ($X$ dan $Y$) di mana sisa pembagian $X^2$ dan $Y^2$ oleh $N$ adalah sama&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h3 id="mengapa-sisa-yang-sama-dapat-memecahkan-sandi">Mengapa &amp;ldquo;Sisa yang Sama&amp;rdquo; Dapat Memecahkan Sandi?
&lt;/h3>&lt;p>Misalkan dua angka, $X^2$ dan $Y^2$, memiliki &amp;ldquo;sisa yang sama jika dibagi dengan $N$&amp;rdquo;.
Sisa yang sama berarti, hasil pengurangannya yaitu &lt;strong>&amp;quot;$X^2 - Y^2$&amp;quot; pasti bisa dibagi habis oleh $N$ (merupakan kelipatan $N$)&lt;/strong> .&lt;/p>
&lt;p>Di sini, mari asumsikan angka raksasa $N$ yang digunakan dalam sandi terbentuk dari perkalian dua bilangan prima rahasia ($p$ dan $q$) ($N = p \times q$).&lt;/p>
&lt;p>Jika $X^2 - Y^2$ difaktorkan, hasilnya adalah &lt;strong>$(X - Y)(X + Y)$&lt;/strong> .
Fakta bahwa ini adalah kelipatan $N$ berarti di suatu tempat dalam perkalian ini tersembunyi bilangan prima rahasia $p$ dan $q$.&lt;/p>
&lt;p>Keajaiban terjadi di sini.
Probabilitas secara matematis bahwa dua bilangan prima $p$ dan $q$ akan masuk ke ruangan yang berbeda, yaitu &lt;strong>&amp;quot;$p$ ke ruangan $(X - Y)$&amp;quot; dan &amp;ldquo;$q$ ke ruangan $(X + Y)$&amp;rdquo;&lt;/strong> , adalah &lt;strong>50% (setengah)&lt;/strong> .&lt;/p>
&lt;p>Dengan asumsi hanya bilangan prima $p$ yang masuk ke ruangan $(X - Y)$, mari kita hitung &lt;strong>&amp;ldquo;faktor persekutuan terbesar (komponen terbesar yang sama)&amp;rdquo;&lt;/strong> dari $(X - Y)$ dan $N$.&lt;/p>
&lt;ul>
&lt;li>Isi $(X - Y)$ = $p \times$ angka tertentu&lt;/li>
&lt;li>Isi $N$ = $p \times q$
Satu-satunya komponen yang sama adalah &lt;strong>&amp;quot;$p$&amp;quot;&lt;/strong> !&lt;/li>
&lt;/ul>
&lt;p>Artinya, saat kita menghitung faktor persekutuan terbesar, bilangan prima rahasia $p$ akan langsung terungkap, dan sandi akan berhasil dipecahkan sepenuhnya. (&lt;em>Faktor persekutuan terbesar bisa dihitung dalam sekejap bahkan menggunakan ponsel dengan &amp;ldquo;Algoritma Euclidean&amp;rdquo;&lt;/em>)&lt;/p>
&lt;p>&lt;strong>[Kolom Singkat: Mengapa Pangkat Dua? Pangkat Tiga atau Dikali Dua Tidak Bisa?]&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>Jika &amp;ldquo;$2X - 2Y$&amp;rdquo;, hasilnya adalah $2(X - Y)$, sehingga hanya ada satu ruangan dan bilangan prima tidak dapat dipisahkan. Jika &amp;ldquo;$X^3 - Y^3$&amp;rdquo;, ukuran ruangan akan tidak seimbang, sehingga perhitungan menjadi sia-sia dan berat. Untuk memisahkan dua bilangan prima, membaginya dengan indah menjadi dua ruangan &amp;ldquo;pangkat dua&amp;rdquo; adalah yang paling efisien.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="bab-2-bagaimana-mencari-x-dan-y-teka-teki-mengumpulkan-kartu-bilangan-prima">Bab 2: Bagaimana Mencari X dan Y? &amp;ldquo;Teka-teki Mengumpulkan Kartu Bilangan Prima&amp;rdquo;
&lt;/h2>&lt;p>Tujuannya sudah jelas. Namun, jika kita menebak-nebak mencari &amp;ldquo;$X^2$ dan $Y^2$ yang sisanya sama&amp;rdquo;, kita tidak akan menemukannya sampai alam semesta kiamat.
Oleh karena itu, matematikawan memikirkan metode jenius yang disebut &lt;strong>&amp;ldquo;Teka-teki Mengumpulkan Kartu Bilangan Prima&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h3 id="langkah-1-menyaring-dan-mengumpulkan-hanya-serbuk-emas-angka-yang-halus">Langkah 1: Menyaring dan Mengumpulkan Hanya Serbuk Emas (Angka yang Halus)
&lt;/h3>&lt;p>Pertama, siapkan angka sembarang $Z$, kuadratkan, dan hitung sisa $W$ ketika dibagi $N$.
(Dunia sisa dari $Z^2 = W$)&lt;/p>
&lt;p>Faktorkan sisa $W$ yang muncul. Di sini, hanya jika muncul &lt;strong>&amp;quot;$W$ yang hanya terdiri dari bilangan prima kecil seperti 2, 3, 5, 7&amp;quot;&lt;/strong> , kita simpan persamaan tersebut sebagai &amp;ldquo;kartu pemenang&amp;rdquo;, dan membuangnya jika ada bilangan prima besar yang tercampur.
Ini seperti menyaring batu-batu besar di sungai dan hanya mengumpulkan serbuk emas.&lt;/p>
&lt;h3 id="langkah-2-teka-teki-membuat-semua-berjumlah-genap">Langkah 2: Teka-teki Membuat Semua Berjumlah &amp;ldquo;Genap&amp;rdquo;
&lt;/h3>&lt;p>Misalnya, terkumpul tiga kartu serbuk emas berikut.&lt;/p>
&lt;ul>
&lt;li>Kartu A: $Z_1^2 = 2^3 \times 3^1$&lt;/li>
&lt;li>Kartu B: $Z_2^2 = 2^1 \times 5^1$&lt;/li>
&lt;li>Kartu C: $Z_3^2 = 3^1 \times 5^1$&lt;/li>
&lt;/ul>
&lt;p>Mari kita kalikan semuanya.
Sisi kanan menjadi $(2^3 \times 3^1) \times (2^1 \times 5^1) \times (3^1 \times 5^1)$,
jika disederhanakan menjadi &lt;strong>&amp;quot;$2^4 \times 3^2 \times 5^2$&amp;quot;&lt;/strong> .&lt;/p>
&lt;p>Luar biasa, jumlah bilangan prima menjadi &amp;ldquo;4, 2, 2&amp;rdquo;, &lt;strong>semuanya berjumlah genap&lt;/strong> !
Jika semuanya genap, berarti kita bisa membagi dua jumlahnya untuk menjadikannya &amp;ldquo;pangkat dua dari sesuatu&amp;rdquo;.
Artinya, $(2^2 \times 3^1 \times 5^1)^2 = (60)^2$.&lt;/p>
&lt;p>Karena sisi kiri adalah $(Z_1 \times Z_2 \times Z_3)^2$, akhirnya kita mendapatkan,
&lt;strong>$X = (Z_1 \times Z_2 \times Z_3)$&lt;/strong>
&lt;strong>$Y = 60$&lt;/strong>
Pasangan &amp;ldquo;$X^2 = Y^2$&amp;rdquo; yang ditunggu-tunggu pun selesai!&lt;/p>
&lt;p>Bagi komputer, memecahkan teka-teki apakah jumlah bilangan prima &amp;ldquo;genap atau ganjil (0 atau 1)&amp;rdquo; adalah hal yang sangat mudah, jadi dengan metode ini $X$ dan $Y$ bisa ditemukan dengan sangat cepat.&lt;/p>
&lt;hr>
&lt;h2 id="bab-3-tembok-keputusasaan-yang-menghadang">Bab 3: Tembok Keputusasaan yang Menghadang
&lt;/h2>&lt;p>Dengan ini semua sandi bisa dipecahkan! &amp;hellip;begitulah yang dipikirkan, hingga sebuah masalah besar muncul.
Jika angka sandi $N$ berukuran hingga sekitar &amp;ldquo;100 digit&amp;rdquo;, metode ini (disebut Quadratic Sieve) bisa menyelesaikannya. Namun, jika $N$ menjadi &amp;ldquo;200 digit atau 300 digit&amp;rdquo;, nilai $W$ yang muncul di tengah perhitungan menjadi terlalu besar.&lt;/p>
&lt;p>Jika angkanya terlalu besar, &amp;ldquo;angka yang hanya terdiri dari bilangan prima kecil (serbuk emas)&amp;rdquo; akan berhenti muncul. Ini menjadi lebih sulit daripada mencari lensa kontak di padang pasir, dan kita tidak bisa mengumpulkan kartu sama sekali untuk memecahkan teka-teki.&lt;/p>
&lt;p>Di sinilah akhirnya senjata pamungkas umat manusia, &lt;strong>&amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo;&lt;/strong> , muncul.&lt;/p>
&lt;hr>
&lt;h2 id="bab-4-ide-terkuat-umat-manusia-membuat-dua-dunia">Bab 4: Ide Terkuat Umat Manusia Membuat &amp;ldquo;Dua Dunia&amp;rdquo;
&lt;/h2>&lt;p>Ide jenius GNFS adalah, &lt;strong>&amp;ldquo;Karena kita hanya menghitung di dunia nyata, angkanya menjadi besar. Kalau begitu, mari buat &amp;lsquo;dunia di balik layar&amp;rsquo; menggunakan polinomial (aljabar), dan bagi beban perhitungannya menjadi dua&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h3 id="keajaiban-aljabar">Keajaiban Aljabar
&lt;/h3>&lt;p>GNFS mengubah angka raksasa $N$ menjadi bentuk aljabar menggunakan angka dasar $m$.
Misalnya, jika $N=100$, dengan $m=4$, maka $100 = 4^3 + 2(4^2) + 4$.
Menggunakan huruf $x$, ini diubah menjadi persamaan (dunia balik layar) &lt;strong>$f(x) = x^3 + 2x^2 + x$&lt;/strong> .&lt;/p>
&lt;p>Hal yang menarik dari persamaan ini adalah sifatnya: &lt;strong>&amp;ldquo;Jika huruf $x$ disubstitusi dengan $m$ (4 dalam contoh di atas), ia akan selalu melesat kembali ke angka dunia nyata $N$&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;h3 id="mencari-serbuk-emas-di-dua-dunia-sekaligus">Mencari Serbuk Emas di Dua Dunia Sekaligus
&lt;/h3>&lt;p>GNFS membuat banyak pasangan bilangan bulat sembarang $(a, b)$, dan melakukan dua perhitungan berikut secara bersamaan.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Dunia nyata&lt;/strong>: $a - b \times m$&lt;/li>
&lt;li>&lt;strong>Dunia aljabar&lt;/strong>: Nilai perhitungan $a - b \times x$ berdasarkan aturan aljabar&lt;/li>
&lt;/ol>
&lt;p>Dengan membagi masalah ke dalam dua dunia, ukuran angka yang ditangani berkurang (menjadi lebih ringan) secara drastis. Bayangkan memecah batu raksasa menjadi dua batu kecil yang mudah dikelola.&lt;/p>
&lt;p>Kemudian, dengan menggunakan saringan, kumpulkan HANYA pasangan $(a, b)$ ajaib di mana &lt;strong>&amp;ldquo;Baik di dunia nyata maupun di dunia aljabar, keduanya &amp;lsquo;hanya terdiri dari bilangan prima kecil (serbuk emas)&amp;rsquo;&amp;rdquo;&lt;/strong> . Inilah asal mula nama &amp;ldquo;Number Field Sieve&amp;rdquo;.&lt;/p>
&lt;h3 id="saat-sandi-akhirnya-dipecahkan">Saat Sandi Akhirnya Dipecahkan
&lt;/h3>&lt;p>Ketika puluhan juta &amp;ldquo;kartu serbuk emas&amp;rdquo; dari kedua dunia terkumpul, gunakan kalkulasi matriks raksasa dari superkomputer untuk menemukan &amp;ldquo;kombinasi di mana semua jumlah bilangan prima genap&amp;rdquo;, persis seperti di Bab 2.&lt;/p>
&lt;p>Setelah kombinasi ditemukan,&lt;/p>
&lt;ul>
&lt;li>Jadikan angka pangkat dua yang terbentuk di dunia nyata sebagai &lt;strong>$X^2$&lt;/strong>&lt;/li>
&lt;li>Jadikan rumus pangkat dua yang terbentuk di dunia aljabar sebagai &lt;strong>$Y(x)^2$&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Terakhir, substitusikan $x$ dalam $Y(x)$ dari dunia aljabar dengan $m$, memindahkan dan menggabungkannya ke dunia nyata.
Lalu, seperti keajaiban matematika, kondisi &lt;strong>&amp;ldquo;sisa pembagian $X^2$ dan $Y^2$ sama&amp;rdquo;&lt;/strong> akan terbentuk dengan sempurna!&lt;/p>
&lt;p>Setelah itu, seperti di Bab 1, dengan menghitung faktor persekutuan terbesar dari $X - Y$ dan $N$, sandi RSA yang tak tertembus akan hancur lebur, dan bilangan prima rahasia akan terungkap.&lt;/p>
&lt;hr>
&lt;h2 id="penutup-matematika-tidak-berakhir">Penutup: Matematika Tidak Berakhir
&lt;/h2>&lt;p>Anda mungkin berpikir, &amp;ldquo;Bagus, dengan GNFS sandi apapun bisa dipecahkan!&amp;rdquo;.
Namun, sandi RSA tidak menyerah begitu saja. Sandi yang digunakan di internet saat ini adalah angka raksasa mengerikan yang disebut &amp;ldquo;RSA-2048 (sekitar 617 digit)&amp;rdquo;.&lt;/p>
&lt;p>Meskipun GNFS adalah algoritma terkuat umat manusia, bahkan untuk memecahkan 270 digit (RSA-270) sekalipun, dikatakan akan memakan waktu ribuan hingga puluhan ribu tahun meskipun seluruh komputer di dunia digabungkan. Untuk saat ini, data LINE dan bank kita aman.&lt;/p>
&lt;p>Namun, apa yang akan terjadi jika muncul &lt;strong>&amp;ldquo;keajaiban yang bisa menemukan $X$ dan $Y$ dalam sekejap untuk angka sebesar apa pun&amp;rdquo;&lt;/strong> ?
Sebenarnya, entitas terdekat dengan hal tersebut saat ini sedang dalam pengembangan, yaitu &lt;strong>&amp;ldquo;Komputer Kuantum (Algoritma Shor)&amp;rdquo;&lt;/strong> . Telah dibuktikan secara matematis bahwa dengan menggunakan sifat gelombang mekanika kuantum, teka-teki pengumpulan kartu yang merepotkan dapat dilewati untuk menarik jawaban sekaligus.&lt;/p>
&lt;p>Persaingan kecerdasan yang tiada akhir antara pembuat sandi (pertahanan) dan pembuat algoritma pemecah sandi (serangan).
Mengetahui bahwa &amp;ldquo;faktorisasi prima&amp;rdquo; dan &amp;ldquo;aljabar&amp;rdquo; yang dipelajari di SMP sebenarnya adalah senjata yang saling bertabrakan di garis depan keamanan dunia, bukankah kelas matematika sekarang terlihat sedikit lebih menarik?&lt;/p>
&lt;p>Orang yang menemukan algoritma terkuat di masa depan, mungkin saja adalah Anda yang sedang membaca artikel ini!&lt;/p>
&lt;hr>
&lt;p>&lt;em>(※Artikel ini mengonsepkan daya tarik matematis dari pemecahan sandi untuk pelajar SMP. GNFS yang sebenarnya dihitung secara ketat menggunakan matematika universitas tingkat lanjut seperti grup kelas ideal dari medan aljabar dan homomorfisme)&lt;/em>&lt;/p></description></item><item><title>Prinsip Kerckhoffs</title><link>http://kenji.blog/id/p/prinsip-kerckhoffs/</link><pubDate>Wed, 16 Apr 2025 23:53:08 +0900</pubDate><guid>http://kenji.blog/id/p/prinsip-kerckhoffs/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2.png" alt="Featured image of post Prinsip Kerckhoffs" />&lt;h1 id="prinsip-kerckhoffs">Prinsip Kerckhoffs
&lt;/h1>&lt;hr>
&lt;p>Halo!&lt;/p>
&lt;p>Hari ini saya ingin membicarakan tentang sesuatu yang cukup menarik dan sebenarnya sangat penting, yaitu &amp;ldquo;Prinsip Kerckhoffs&amp;rdquo;.&lt;/p>
&lt;p>Oh, tunggu sebentar.&lt;br>
Mungkin ada di antara Anda yang berpikir, &amp;ldquo;Saya belum pernah mendengar tentang &amp;lsquo;Prinsip Kerckhoffs&amp;rsquo; dan kedengarannya terlalu rumit&amp;hellip;&amp;rdquo; Tenang saja. Artikel ini justru ditujukan untuk Anda yang merasa demikian.&lt;/p>
&lt;hr>
&lt;h2 id="apa-maksud-dari-kriptografi-yang-aman">Apa maksud dari &amp;ldquo;Kriptografi yang Aman&amp;rdquo;?
&lt;/h2>&lt;p>Misalnya, seseorang mendatangi Anda dan berkata, &amp;ldquo;Brankas ini hanya bisa dibuka oleh orang yang mengetahui rahasianya.&amp;rdquo;&lt;/p>
&lt;p>Sekilas, itu terdengar sangat aman, bukan?&lt;br>
Namun, jika dipikir-pikir lagi, bukankah itu sedikit mengkhawatirkan?&lt;/p>
&lt;p>Seperti, &amp;ldquo;Jika rahasia itu terungkap, habislah sudah, kan?&amp;rdquo;&lt;/p>
&lt;p>Sebenarnya, inilah alasan mengapa Prinsip Kerckhoffs diperkenalkan.&lt;/p>
&lt;hr>
&lt;h2 id="apa-itu-sebenarnya-prinsip-kerckhoffs">Apa itu sebenarnya &amp;ldquo;Prinsip Kerckhoffs&amp;rdquo;?
&lt;/h2>&lt;p>Secara singkat, ini adalah:&lt;/p>
&lt;p>Pemikiran bahwa &lt;strong>&amp;ldquo;Kriptografi harus tetap aman meskipun mekanismenya terungkap&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Lebih tepatnya, &amp;ldquo;Keamanan hanya boleh bergantung pada &amp;lsquo;kunci rahasia&amp;rsquo;, dan tidak masalah jika metode enkripsi itu sendiri dipublikasikan!&amp;rdquo;&lt;/p>
&lt;p>Sebaliknya, &amp;ldquo;Sistem yang hanya mengandalkan kerahasiaan algoritma (mekanisme) enkripsinya dianggap memiliki keandalan yang rendah.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h2 id="aman-asalkan-mekanismenya-rahasia-mungkin-sedikit-berbahaya">&amp;ldquo;Aman asalkan mekanismenya rahasia&amp;rdquo; mungkin sedikit berbahaya
&lt;/h2>&lt;p>Cara berpikir seperti ini sangat umum:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Saya tidak menunjukkan isi aplikasi ini kepada siapa pun, jadi keamanannya terjamin.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Saya mengerti perasaan itu.&lt;br>
Tetapi, itu sama saja dengan mengatakan, &amp;ldquo;Karena tidak ada yang melihatnya, tidak ada celah yang ditemukan, jadi pasti aman, kan?&amp;rdquo;&lt;/p>
&lt;p>Pada kenyataannya, fakta bahwa &amp;ldquo;tidak ada yang melihat&amp;rdquo; itu sendiri bisa menjadi sebuah risiko.&lt;/p>
&lt;hr>
&lt;h2 id="tetapi-mengapa-prinsip-seperti-itu-penting">Tetapi, mengapa prinsip seperti itu penting?
&lt;/h2>&lt;p>Alasannya adalah, jika seseorang mendapatkan mekanismenya dan dapat memecahkannya dengan mudah, maka kriptografi tersebut gagal.&lt;/p>
&lt;p>Sebagai analogi, bayangkan sebuah kunci pintu yang memiliki mekanisme yang sangat rumit, tetapi sebenarnya bisa dibuka dengan kunci duplikat yang dibuat di toko murah.&lt;/p>
&lt;p>Bukan &amp;ldquo;Aman karena kuncinya rahasia&amp;rdquo;, tetapi yang penting adalah &amp;ldquo;Bahkan jika seluruh mekanismenya diperlihatkan, tidak akan bisa dibuka tanpa kunci yang tepat.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h2 id="perasaan-tapi-bukankah-itu-menakutkan">Perasaan &amp;ldquo;Tapi, bukankah itu menakutkan?&amp;rdquo;
&lt;/h2>&lt;p>Hal yang dirasakan oleh banyak orang di sini adalah,&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Mengekspos seluruh mekanisme, bukankah itu agak menakutkan?&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Saya mengerti kecemasan tersebut.&lt;/p>
&lt;p>Karena Anda pasti akan berpikir, &amp;ldquo;Jika saya menunjukkan semuanya, bukankah itu akan ditiru atau disalahgunakan?&amp;rdquo;&lt;/p>
&lt;p>Namun, justru di situlah letak inti dari Prinsip Kerckhoffs.&lt;br>
&amp;ldquo;Kekuatan yang tidak hancur meskipun isinya diperlihatkan&amp;rdquo; itulah keamanan yang sesungguhnya.&lt;/p>
&lt;hr>
&lt;h2 id="meskipun-begitu-butuh-sedikit-keberanian-pada-awalnya">Meskipun begitu, butuh sedikit keberanian pada awalnya
&lt;/h2>&lt;p>Jika mencoba menempatkan diri sebagai pengembang, &amp;ldquo;Mempublikasikan mekanisme = kelemahan juga terlihat&amp;rdquo;, tentu saja itu mendebarkan.&lt;/p>
&lt;p>Tapi coba pikirkan.&lt;/p>
&lt;p>Sesuatu yang secara terbuka menunjukkan mekanismenya dan mengatakan, &amp;ldquo;Siapa pun boleh memverifikasinya,&amp;rdquo; pada akhirnya akan lebih dipercaya.&lt;/p>
&lt;p>Itu mirip dengan hubungan antar manusia, bukan?&lt;/p>
&lt;p>&amp;ldquo;Seseorang yang menunjukkan jati dirinya dan tetap berteman dengan baik&amp;rdquo;, tentu saja adalah yang paling bisa membuat kita merasa tenang.&lt;/p>
&lt;hr>
&lt;h2 id="jadi-begitulah">Jadi begitulah
&lt;/h2>&lt;p>Prinsip Kerckhoffs mungkin terdengar sedikit teoritis, namun esensinya sangat sederhana.&lt;/p>
&lt;p>Hanya masalah &lt;strong>&amp;ldquo;Mari kita buat mekanisme yang tidak akan rusak tidak peduli siapa yang melihatnya&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Desain yang tepat lebih dari sekadar rahasia yang dangkal.&lt;br>
Kode yang tidak memalukan untuk ditunjukkan, lebih baik daripada kode yang tidak ingin Anda tunjukkan kepada siapa pun.&lt;/p>
&lt;p>&amp;ldquo;Kekuatan&amp;rdquo; seperti itu mungkin akan semakin dibutuhkan di era mendatang.&lt;/p>
&lt;hr>
&lt;p>Terima kasih sudah membaca!&lt;/p>
&lt;p>Topik keamanan mungkin sedikit sulit, tetapi ada bagian yang terhubung dengan &amp;ldquo;hubungan manusia&amp;rdquo; dan &amp;ldquo;rasa aman sehari-hari&amp;rdquo;.&lt;br>
Saya yakin jika Anda mempelajarinya sedikit demi sedikit tanpa merasa terbebani, akan ada hal baik yang terjadi.&lt;/p>
&lt;hr>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img.png"
width="189"
height="282"
srcset="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="Auguste Kerckhoffs"
class="gallery-image"
data-flex-grow="67"
data-flex-basis="160px"
>&lt;/p></description></item></channel></rss>