हम इस अध्याय की शुरुआत एक असामान्य बात से करेंगे — NTT एल्गोरिदम काफी सरल है और इसे 20 से कम लाइन के कोड में लागू (implement) किया जा सकता है। हालाँकि, इसके काम करने के पीछे का जो मुख्य विचार है, अजीब तरह से, उसका कोई औपचारिक गणितीय नाम नहीं है। इसलिए हम इस एल्गोरिदम के पीछे की मुख्य थ्योरम (core theorem) को एक (व्यक्तिगत रूप से) आकर्षक नाम देने की स्वतंत्रता ले रहे हैं:
मल्टीवैल्यूड फंक्शन्स के लिए इमेज प्रिजर्वेशन थ्योरम (The Image Preservation Theorem for Multivalued Functions)
इमेज प्रिजर्वेशन थ्योरम को समझाने के लिए, हम roots of unity के बारे में एक अंतिम (बहुत ही सरल) कॉन्सेप्ट पर चर्चा करेंगे, और फिर थ्योरम को प्रस्तुत करेंगे।
नेस्टेड स्क्वायर रूट्स (nested square roots) के -th रूट्स
“k-th root of unity” की शाब्दिक परिभाषा यह है कि root of unity , को संतुष्ट करता है। दूसरे शब्दों में कहें तो:
इसलिए, इसमें कोई आश्चर्य नहीं होना चाहिए कि यदि एक primitive 4-th root of unity है, तो
अब मान लीजिए कि एक primitive 8-th root of unity है, और हम यही ऑपरेशन करते हैं। इसका परिणाम होगा:
और 1 का 8-th रूट सभी 8-th roots of unity उत्पन्न करता है:
ये अवलोकन (observations) केवल परिभाषा का मामला हैं। बेशक, हम 1 का स्क्वायर रूट सीधे (directly) कैलकुलेट नहीं करना चाहते हैं। इसके बजाय, पहले primitive -th root of unity खोजना और फिर के लिए उत्तरों का सेट उत्पन्न करना बहुत आसान है। उदाहरण के लिए:
import galois
Fq = 17
k = 8
assert (Fq - 1) % k == 0, "no such subgroup"
GF = galois.GF(Fq)
pr = GF.primitive_root_of_unity(k)
roots = []
for i in range(0,k):
roots.append(pr**i)
print(roots)
हम यह भी देख सकते हैं कि:
और इसी तरह। जैसा कि ऊपर बताया गया है, सीधे की गणना करना एफ़िशिएंट (efficient) नहीं है। इसके बजाय, हम निम्नलिखित आरेख (diagram) पर विचार करते हैं, जहाँ नीचे की ओर जाने वाला प्रत्येक तीर अपने ऊपर वाली संख्या का स्क्वायर रूट है:

हम 1 से शुरुआत करके और बार-बार स्क्वायर रूट लेकर 8-th roots of unity की गणना कर सकते हैं।
किसी भी arbitrary के लिए, आरेख इस प्रकार है।

यहाँ स्क्वायर रूट गणनाओं का एक वॉकथ्रू (walkthrough) दिया गया है:
1 का स्क्वायर रूट है। , -1 के सर्वांगसम (congruent) है।
पिछले अध्याय से याद करें कि का स्क्वायर रूट और होता है (यह मानते हुए कि सम/even है)।
इस प्रकार, का स्क्वायर रूट है।
यह भी याद रखें कि का योज्य प्रतिलोम (additive inverse) है।
इसलिए नकारात्मक (negative) चिह्न के बिना की गणना करने के लिए, हम की गणना करते हैं। अतः का स्क्वायर रूट है।
का स्क्वायर रूट है। फिर से, नकारात्मक चिह्न को हटाने के लिए, हम की गणना करते हैं।
का स्क्वायर रूट क्यों है, यह पाठक के लिए एक अभ्यास (exercise) के रूप में छोड़ दिया गया है।
ट्री (tree) की ऊंचाई है
1 का बार-बार स्क्वायर रूट लेकर -th roots of unity की गणना करने पर एक “ट्री” बनता है जिसकी ऊंचाई होती है।
ट्री की मध्यवर्ती अवस्थाओं (intermediate states) की संकल्पना
सेट
गणितीय रूप से 8-th roots of unity के समतुल्य (equivalent) है। यह सेट इसके भी समतुल्य है:
जो इसके भी समतुल्य है:
दूसरे शब्दों में:
एक त्वरित विषय-अंतर (Quick aside) — मल्टीवैल्यूड फंक्शन्स और इमेजेस (images)
यह सच है कि हमने ऊपर जो अवलोकन किए हैं, वे -th रूट्स की परिभाषा के सामान्य विस्तार (trivial extensions) हैं। इन अवलोकनों के अधिक रोचक निहितार्थ (implications) अगले भाग में दिखाए जाएंगे। हालाँकि, पहले कुछ गणितीय शब्दावली का परिचय देना मददगार होगा:
फंक्शन की इमेज (Image of a function) — यदि हमारे पास बिंदुओं (points) का एक सेट है जिस पर हम किसी फंक्शन का मूल्यांकन करते हैं, तो मूल्यांकनों का सेट इमेज (image) कहलाता है। उदाहरण के लिए, यदि फंक्शन है और जिस डोमेन (domain) पर हम का मूल्यांकन करते हैं वह है, तो इमेज होगी। किसी फंक्शन की रेंज (range) का अर्थ उन मानों का सेट है जो एक फंक्शन आउटपुट कर सकता है। हमारे संदर्भ में, फंक्शन की इमेज से तात्पर्य दिए गए इनपुट्स के सेट के लिए आउटपुट्स के वास्तविक सेट से है।
मल्टीवैल्यूड फंक्शन (Multivalued function) — एक ऐसा फंक्शन जो डोमेन में एक ही बिंदु के लिए एक से अधिक मूल्यांकन (evaluation) लौटा सकता है। उदाहरण के लिए, 0 पर मूल्यांकित , 0 लौटाता है, लेकिन 1 पर मूल्यांकित , लौटाता है।
नोट: मल्टीवैल्यूड फंक्शन की इमेज उसके डोमेन से बड़ी होती है।
इन परिभाषाओं को ध्यान में रखते हुए, पाठक को निम्नलिखित कथनों को समझना चाहिए:
“डोमेन पर की इमेज है”
“डोमेन पर मल्टीवैल्यूड फंक्शन की इमेज है”
अब हम अवलोकनों के एक अधिक रोचक सेट पर आते हैं।
पर मूल्यांकित की इमेज, (k = 8) पर मूल्यांकित के समान है
यह दावा ऊपर दिखाए गए कॉन्सेप्ट्स का एक सरल पुनर्लेखन है, इसलिए हम इस पर अधिक विस्तार से चर्चा नहीं करेंगे। दिलचस्प बात यह है कि हम इसे अन्य फंक्शन्स के लिए कैसे सामान्यीकृत (generalize) कर सकते हैं।
यहाँ सूक्ष्म बात (nuance) यह है कि एक मल्टीवैल्यूड फंक्शन है जो आठ एलीमेंट्स (elements) लौटाता है।
4-th roots of unity पर मूल्यांकित की इमेज, (k = 4) पर मूल्यांकित मल्टीवैल्यूड फंक्शन के समान है
याद रखें, , इसलिए । यह बिल्कुल उसी इमेज के समान है जो प्रत्येक root of unity पर एक-एक करके का मूल्यांकन करने से प्राप्त होती है। चूँकि
पाठक के लिए अभ्यास: मान लीजिए है। 4-th roots of unity पर की इमेज क्या है? डोमेन पर मल्टीवैल्यूड फंक्शन की इमेज क्या है?
आने वाले अध्यायों में, हम दिखाएंगे कि जैसे अधिक जटिल मामलों को कैसे सँभाला जाए, लेकिन अभी के लिए, हम दिखाते हैं कि वास्तव में हमारे द्वारा दिखाए गए सरल मामलों के लिए मल्टीवैल्यूड फंक्शन्स की गणना कैसे की जाती है। लेकिन पहले, आइए इमेज समतुल्यता (image equivalence) के बारे में अब तक किए गए अवलोकन को एक औपचारिक परिभाषा देते हैं।
4-th roots of unity पर मूल्यांकित की इमेज, second roots of unity (k = 4) पर मूल्यांकित मल्टीवैल्यूड फंक्शन के समान है
यह उदाहरण ऊपर दिए गए उदाहरण के काफी समान है, सिवाय इसके कि हम डोमेन को “लक्षित” (target) नहीं करते हैं, बल्कि को करते हैं।
हमारे पास है
यह पर का मूल्यांकन करने पर प्राप्त इमेज के ही समान है।
संक्षेप में, यदि हम डोमेन को के फैक्टर से “सिकोड़ते” (shrink) हैं और एक नया मल्टीवैल्यूड फंक्शन बनाने के लिए के प्रत्येक को से बदल देते हैं, तो और की इमेजेस बिल्कुल समान (identical) होती हैं।
अब हम उस कॉन्सेप्ट को औपचारिक रूप से परिभाषित करेंगे जिसे हम दर्शा रहे हैं।
NTT की मुख्य थ्योरम: मल्टीवैल्यूड फंक्शन्स के लिए इमेज प्रिजर्वेशन थ्योरम
मान लीजिए एक primitive -th root of unity है और , में परिभाषित -th roots of unity हैं।
मान लीजिए , 2 की पावर है।
मान लीजिए , में एक बहुपद (polynomial) है। मान लीजिए , 2 की एक पावर है जो से कम या उसके बराबर है।
मान लीजिए एक मल्टीवैल्यूड फंक्शन है जिसे के प्रत्येक को से बदलकर बनाया गया है।
मान लीजिए डोमेन , है। ध्यान दें कि यदि है तो ।
पर की इमेज ठीक पर की इमेज के बराबर होती है।
यह अत्यंत महत्वपूर्ण है कि पाठक उपरोक्त थ्योरम को समझें, क्योंकि यह वह मुख्य कॉन्सेप्ट है जिस पर Number Theoretic Transform निर्भर करता है!
इस कॉन्सेप्ट को पुख्ता (enforce) करने के लिए यहाँ कुछ उदाहरण दिए गए हैं:
- 4-th roots of unity पर की इमेज, second roots of unity पर की इमेज के बराबर है (जैसा कि पिछले भाग में दिखाया गया है)।
- 16th roots of unity पर की इमेज, 8th roots of unity पर की इमेज के बराबर है।
- k-th roots of unity पर की इमेज, k/2-th roots of unity पर की इमेज के बराबर है।
- k/2-th roots of unity पर की इमेज, k/4-th roots of unity पर की इमेज के बराबर है।
अगला भाग ऐसे उदाहरण दिखाता है जहाँ थोड़ा अधिक जटिल है।
के लिए इमेज प्रिजर्वेशन थ्योरम के उदाहरण
मान लीजिए है और डोमेन 4-th roots of unity है।
मान लीजिए एक मल्टीवैल्यूड फंक्शन है और डोमेन या समतुल्य रूप से है।
मान लीजिए एक मल्टीवैल्यूड फंक्शन है और डोमेन है।
, , और की इमेजेस समान हैं:
NTT से संबंध
याद रखें, NTT का लक्ष्य समय में -th roots of unity पर का मूल्यांकन करना है। दूसरे शब्दों में, हम -th roots of unity पर की इमेज की गणना करना चाहते हैं।
आप शायद अनुमान लगा सकते हैं कि यह किस ओर जा रहा है।
-th roots of unity पर की इमेज की गणना करना एक नए फंक्शन की इमेज की गणना करने के समतुल्य है, जिसे इस तरह परिभाषित किया गया है कि में प्रत्येक के लिए, का मूल्यांकन पर किया गया हो।
हालाँकि, यह एक खुला प्रश्न छोड़ देता है:
को में विस्तारित (expanding) करने से सीधे तौर पर गति (speedup) नहीं बढ़ती है। एल्गोरिथम के दृष्टिकोण से, को -th roots of unity में विस्तारित करना को बिंदुओं पर मूल्यांकन करने के समान ही है। का मूल्यांकन करने का यह वैकल्पिक तरीका हमारी कैसे मदद करता है?
अगले अध्याय में, हम दिखाएंगे कि स्क्वायर रूट विस्तार (square root expansion) का उपयोग करके मल्टी-वैल्यूड फंक्शन्स का मूल्यांकन कैसे किया जाता है और यह समझाएंगे कि यह दृष्टिकोण अनावश्यक गणनाओं (redundant computation) को कैसे रोक सकता है।