फ्रैक्ट्रान

फ्रैक्ट्रान ट्यूरिंग-पूर्ण गूढ़ प्रोग्रामिंग भाषा है, जिसका आविष्कार गणितज्ञ जॉन हॉर्टन कॉनवे ने किया था। फ्रैक्ट्रान प्रोग्राम सकारात्मक अंश (गणित) का प्रारंभिक पूर्णांक इनपुट N के साथ अनुक्रम है। प्रोग्राम निम्नानुसार पूर्णांक 'N' को अद्यतन करके चलाया जाता है।
 * 1) पहले अंश F के लिए सूची में जिसके लिए NF पूर्णांक है, N को NF से बदलें।
 * 2) इस नियम को तब तक करते रहे, जब तक कि सूची में कोई भी अंश N से गुणा करने पर पूर्णांक नहीं बनाता, फिर रुक जाता है।

निम्नलिखित फ्रैक्ट्रान प्रोग्राम देता है, जिसे  मुख्य खेल  कहा जाता है, जो क्रमिक अभाज्य संख्याएँ पाता है।

$$\left( \frac{17}{91}, \frac{78}{85}, \frac{19}{51}, \frac{23}{38}, \frac{29}{33}, \frac{77}{29}, \frac{95}{23}, \frac{77}{19}, \frac{1}{17}, \frac{11}{13}, \frac{13}{11}, \frac{15}{2}, \frac{1}{7}, \frac{55}{1} \right)$$ N=2 से प्रारंभ होकर, यह फ्रैक्ट्रान प्रोग्राम पूर्णांकों के निम्नलिखित अनुक्रम उत्पन्न करता है।

2 के बाद, इस क्रम में 2 की निम्नलिखित घातांक हैं।
 * 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, . ..

$$2^2=4,\, 2^3=8,\, 2^5=32,\, 2^7=128,\, 2^{11}=2048,\, 2^{13}=8192,\, 2^{17}=131072,\, 2^{19}=524288,\, \dots$$जो 2 की प्रधान घातांक हैं।

फ्रैक्ट्रान प्रोग्राम को समझना
फ्रैक्ट्रान प्रोग्राम को प्रकार की रजिस्टर मशीन के रूप में देखा जा सकता है, जहाँ रजिस्टरों को तर्क n में प्रमुख घातांक में संग्रहीत किया जाता है।

गोडेल संख्या का उपयोग करते हुए, सकारात्मक पूर्णांक n स्वेच्छया से बड़े सकारात्मक पूर्णांक चर की स्वेच्छा संख्या को सांकेतिक शब्दों में बदल सकता है। प्रत्येक चर का मान पूर्णांक के पूर्णांक गुणनखंड में अभाज्य संख्या के घातांक के रूप में सांकेतिक किया गया है। उदाहरण के लिए, पूर्णांक

$$60 = 2^2 \times 3^1 \times 5^1$$ रजिस्टर स्थिति का प्रतिनिधित्व करता है,चर जिसे हम v2 कहेंगे जिसका मान 2 है और दो अन्य चर (v3 और v5) का मान 1 है। अन्य सभी चर का मान 0 है।

फ्रैक्ट्रान प्रोग्राम सकारात्मक अंशों की क्रमबद्ध सूची है। प्रत्येक अंश निर्देश का प्रतिनिधित्व करता है जो अधिक चर का परीक्षण करता है। जो इसके भाजक के प्रमुख कारकों द्वारा दर्शाया जाता है। उदाहरण के लिए,

$$f_1 = \frac{21}{20} = \frac{3 \times 7}{2^2 \times 5^1}$$ परीक्षण v2 और v5। यदि $$v_2 \ge 2$$ और $$v_5 \ge 1$$, फिर यह v2 से 2 और v5 से 1 घटाता है और 1 को v3 और 1 को v7 में जोड़ता है। उदाहरण के लिए,

$$60 \cdot f_1 = 2^2 \times 3^1 \times 5^1 \cdot \frac{3 \times 7}{2^2 \times 5^1} = 3^2 \times 7^1$$ चूँकि, फ्रैक्ट्रान प्रोग्राम केवल भिन्नों की सूची है। ये परीक्षण-कमी-वृद्धि निर्देश फ्रैक्ट्रान भाषा में केवल अनुमत निर्देश हैं। इसके अतिरिक्त निम्नलिखित प्रतिबंध लागू होते हैं।


 * हर बार निर्देश निष्पादित किया जाता है, परीक्षण किए गए चर भी कम हो जाते हैं।
 * चर को निर्देश में घटाया और बढ़ाया नहीं जा सकता हैं। अन्यथा उस निर्देश का प्रतिनिधित्व करने वाला अंश अपने निम्नतम शब्दों में नहीं होगा। इसलिए प्रत्येक फ्रैक्ट्रान निर्देश चर का उपभोग करता है क्योंकि यह उनका परीक्षण करता है।
 * यदि चर 0 है, तो फ्रैक्ट्रान निर्देश के लिए सीधे परीक्षण करना संभव नहीं है। चूंकि, अप्रत्यक्ष परीक्षण को व्यतिक्रम निर्देश बनाकर लागू किया जा सकता है जो किसी विशेष चर का परीक्षण करने वाले अन्य निर्देशों के बाद रखा जाता है।

जोड़
सबसे सरल फ्रैक्ट्रान प्रोग्राम एकल निर्देश है जैसे

$$\left( \frac{3}{2} \right)$$ इस प्रोग्राम को निम्नानुसार बहुत सरल कलन विधि के रूप में दर्शाया जा सकता है।

प्रपत्र के प्रारंभिक इनपुट को देखते हुए $$2^a 3^b$$, यह प्रोग्राम अनुक्रम की गणना करेगा $$2^{a-1} 3^{b+1}$$, $$2^{a-2} 3^{b+2}$$, आदि, अंततः, के बाद तक $$a$$ चरण, 2 का कोई कारक नहीं रहता है और उत्पाद के साथ $$\frac{3}{2}$$ अब कोई पूर्णांक नहीं देता है। मशीन तब के अंतिम आउटपुट के साथ बंद हो जाती है $$ 3^{a + b} $$. इसलिए यह दो पूर्णांकों को साथ जोड़ता है।

गुणा
हम योजक के माध्यम से लूप करके गुणक बना सकते हैं। ऐसा करने के लिए हमें अपने कलन विधि में स्थिति (कंप्यूटर विज्ञान) प्रस्तुत करने की आवश्यकता है। यह कलन विधि संख्या लेगा $$2^a 3^b$$ और उत्पादन $$5^{ab}$$।

स्थिति B लूप है जो v3 को v5 में जोड़ता है और v3 को v7 में भी ले जाता है, और स्थिति A बाहरी नियंत्रण लूप है जो लूप को स्थिति B v2 बार दोहराता है। स्थिति B में लूप पूरा होने के बाद स्थिति A भी v7 ​​से v3 के मान को पुनर्स्थापित करता है।

हम स्थिति संकेतकों के रूप में नए चरों का उपयोग करके स्थितियों को लागू कर सकते हैं। स्थिति B के लिए स्थिति संकेतक v11 और v13 होंगे। ध्यान दें कि हमें लूप के लिए दो स्थिति नियंत्रण संकेतकों की आवश्यकता होती है। प्राथमिक ध्वज (v11) और द्वितीयक ध्वज (v13)। क्योंकि जब भी परीक्षण किया जाता है, तो प्रत्येक संकेतक का उपभोग किया जाता है। हमें वर्तमान स्थिति में जारी रखने के लिए द्वितीयक संकेतक की आवश्यकता होती है। इस द्वितीयक संकेतक को अगले निर्देश में प्राथमिक संकेतक पर वापस बदलना किया जाता है और लूप जारी रहता है।

गुणन कलन विधि तालिका में फ्रैक्ट्रान स्थिति संकेतक और निर्देश जोड़ना, हमारे पास है।

जब हम फ्रैक्ट्रान निर्देश लिखते हैं, तो हमें स्थिति A निर्देश को अंतिम में रखना चाहिए, क्योंकि स्थिति A में कोई स्थिति संकेतक नहीं है यदि कोई स्थिति संकेतक स्थिर नहीं है तो यह व्यतिक्रम स्थिति है। जिससे फ्रैक्ट्रान प्रोग्राम के रूप में गुणक बन जाता है।

$$\left( \frac{455}{33}, \frac{11}{13}, \frac{1}{11}, \frac{3}{7}, \frac{11}{2}, \frac{1}{3} \right)$$ इनपुट के साथ 2a3b यह प्रोग्राम आउटपुट 5ab उत्पन्न करता है.



घटाव और भाग
इसी प्रकार, हम फ्रैक्ट्रान घटाव बना सकते हैं और बार-बार घटाव हमें भागफल और शेष कलन विधि बनाने की अनुमति देता है।

फ्रैक्ट्रान प्रोग्राम को लिखते हुए, हमारे पास।

$$\left( \frac{91}{66}, \frac{11}{13}, \frac{1}{33}, \frac{85}{11}, \frac{57}{119}, \frac{17}{19}, \frac{11}{17}, \frac{1}{3} \right)$$ और इनपुट 2n3d11 आउटपुट 5q7r उत्पन्न करता है, जहां n = qd + r और 0 ≤ r < d।

कॉनवे का प्रमुख कलन विधि
उपरोक्त कॉनवे का प्रमुख उत्पादन कलन विधि अनिवार्य रूप से दो लूप के भीतर भागफल और शेष कलन विधि है। प्रपत्र का इनपुट दिया गया $$2^n 7^m$$ जहाँ 0 ≤ m < n, कलन विधि n+1 को प्रत्येक संख्या से n से 1 तक विभाजित करने का प्रयास करता है। जब तक कि यह सबसे बड़ी संख्या k नहीं पाता ,जो n+1 का भाजक है। यह फिर 2 लौटाता है 2n+1 7k-1 दोहराता है। कलन विधि द्वारा उत्पन्न स्थिति संख्याओं का अनुक्रम केवल 2 की घात उत्पन्न करता है जब K 1 होता है जिससे कि 7 का घातांक 0 हो, जो केवल तब होता है जब 2 का घातांक अभाज्य होता है। हैविल (2007) में कॉनवे के कलन विधि की चरण-दर-चरण व्याख्या पाई जा सकती है।

इस प्रोग्राम के लिए अभाज्य संख्या 2, 3, 5, 7... तक पहुँचने के लिए क्रमशः 19, 69, 281, 710,... चरणों की आवश्यकता है।

कॉनवे के प्रोग्राम का प्रकार भी उपस्थित है, जो उपरोक्त संस्करण से दो अंशों से भिन्न है। $$\left( \frac{17}{91}, \frac{78}{85}, \frac{19}{51}, \frac{23}{38}, \frac{29}{33}, \frac{77}{29}, \frac{95}{23}, \frac{77}{19}, \frac{1}{17}, \frac{11}{13}, \frac{13}{11}, \frac{15}{14}, \frac{15}{2}, \frac{55}{1} \right)$$ यह संस्करण थोड़ा तेज़ है। 2, 3, 5, 7... तक पहुँचने में इसे 19, 69, 280, 707... कदम लगते हैं। इस प्रोग्राम का एकल पुनरावृत्ति, प्रधानता के लिए विशेष संख्या N की जाँच करते हुए, निम्नलिखित चरणों की संख्या लेता है। $$N - 1 + (6N+2)(N-b) + 2 \sum\limits^{N-1}_{d=b} \left\lfloor \frac{N}{d} \right\rfloor,$$ जहाँ $$b < N$$, N का सबसे बड़ा पूर्णांक विभाजक है $$\lfloor x \rfloor$$ फ्लोर फंक्शन है। 1999 में, डेविन किल्मिंस्टर ने छोटे दस-निर्देश प्रोग्राम का प्रदर्शन किया। $$\left( \frac{7}{3}, \frac{99}{98}, \frac{13}{49}, \frac{39}{35}, \frac{36}{91}, \frac{10}{143}, \frac{49}{13}, \frac{7}{11}, \frac{1}{2}, \frac{91}{1} \right).$$ प्रारंभिक इनपुट n = 10 के लिए 10 की बाद की घातयों द्वारा क्रमिक अभाज्य उत्पन्न होते हैं।

अन्य उदाहरण
निम्नलिखित फ्रैक्ट्रान प्रोग्राम।

$$\left( \frac{3 \cdot 11}{2^2 \cdot 5}, \frac{5}{11}, \frac{13}{2 \cdot 5}, \frac{1}{5}, \frac{2}{3}, \frac{2 \cdot 5}{7}, \frac{7}{2} \right)$$ A के द्विचर विस्तार के हैमिंग वजन H (A) की गणना करता है अर्थात Aके द्विचर विस्तार में 1 की संख्या। दिया गया इनपुट 2a, इसका आउटपुट 13H(a) है। प्रोग्राम का विश्लेषण इस प्रकार किया जा सकता है।

यह भी देखें

 * निर्देश स्थिर करना कंप्यूटर

बाहरी कड़ियाँ

 * Lecture from John Conway। "फ्रैक्ट्रान। A Ridiculous Logical Language"
 * "Prime Number Pathology। फ्रैक्ट्रान"
 * Prime Number Pathology
 * फ्रैक्ट्रान - (Esolang wiki)
 * Ruby implementation and example programs
 * Project Euler Problem 308
 * "Building Fizzbuzz in फ्रैक्ट्रान from the Bottom Up"
 * Chris Lomont, "A Universal फ्रैक्ट्रान Interpreter in फ्रैक्ट्रान"
 * Chris Lomont, "A Universal फ्रैक्ट्रान Interpreter in फ्रैक्ट्रान"