FRACTRAN
FRACTRAN is a Turing-completeesoteric programming language invented by the mathematician John Conway. A FRACTRAN program is an ordered list of positive fractions together with an initial positive integer input n. The program is run by updating the integer n as follows:
- for the first fraction f in the list for which nf is an integer, replace n by nf
- repeat this rule until no fraction in the list produces an integer when multiplied by n, then halt.
Conway 1987 gives the following FRACTRAN program, called PRIMEGAME, which finds successive prime numbers:
Starting with n=2, this FRACTRAN program generates the following sequence of integers:
- 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... (sequence A007542 in the OEIS), i.e. the sequence of PRIMEGAME numbers
After 2, this sequence contains the following powers of 2:
(sequence A034785 in the OEIS)
The exponent part of these powers of two are primes, 2, 3, 5, etc.
Understanding a FRACTRAN program
A FRACTRAN program can be seen as a type of register machine where the registers are stored in prime exponents in the argument .
Using Gödel numbering, a positive integer can encode an arbitrary number of arbitrarily large positive integer variables.[note 1] The value of each variable is encoded as the exponent of a prime number in the prime factorization of the integer. For example, the integer
represents a register state in which one variable (which we will call ) holds the value 2 and two other variables ( and ) hold the value 1. All other variables hold the value 0.
A FRACTRAN program is an ordered list of positive fractions. Each fraction represents an instruction that tests one or more variables, represented by the prime factors of its denominator. For example:
tests and . If and , then it subtracts 2 from and 1 from and adds 1 to and 1 to . For example:
Since the FRACTRAN program is just a list of fractions, these test-decrement-increment instructions are the only allowed instructions in the FRACTRAN language. In addition the following restrictions apply:
- Each time an instruction is executed, the variables that are tested are also decremented.
- لا يمكن إنقاص قيمة المتغير نفسه وزيادتها في نفس التعليمة (وإلا لما كان الكسر الذي يمثل تلك التعليمة في أبسط صورة ). لذلك، تستهلك كل تعليمة في لغة FRACTRAN متغيرات أثناء اختبارها.
- لا يمكن لتعليمات FRACTRAN أن تختبر بشكل مباشر ما إذا كان المتغير يساوي 0 (ومع ذلك، يمكن تنفيذ اختبار غير مباشر عن طريق إنشاء تعليمات افتراضية يتم وضعها بعد التعليمات الأخرى التي تختبر متغيرًا معينًا).
إنشاء برامج بسيطة
إضافة
أبسط برنامج في لغة FRACTRAN هو تعليمة واحدة مثل:
يمكن تمثيل هذا البرنامج كخوارزمية (بسيطة للغاية) على النحو التالي:
| تعليمات FRACTRAN | حالة | فعل |
|---|---|---|
| > 0 | اطرح 1 من أضف 1 إلى | |
| = 0 | قف |
بافتراض وجود مدخلات أولية على الشكل التاليسيقوم هذا البرنامج بحساب التسلسل،إلخ، حتى النهاية، بعدبعد الخطوات، لم يتبق أي عامل من عوامل العدد 2، ويكون الناتج معلم يعد البرنامج يُنتج عددًا صحيحًا؛ ثم يتوقف البرنامج مع الناتج النهائي التالي:وبالتالي، فهو يجمع عددين صحيحين معاً.
الضرب
يمكننا إنشاء "مضاعف" من خلال "التكرار" عبر "الجامع". وللقيام بذلك، نحتاج إلى إدخال حالات في خوارزميتنا. ستأخذ هذه الخوارزمية عددًاوإنتاج:
| الوضع الحالي | حالة | فعل | الولاية التالية |
|---|---|---|---|
| أ | > 0 | اطرح 1 من أضف 1 إلى | أ |
| = 0 و> 0 | اطرح 1 من | ب | |
| = 0 و= 0 و > 0 | اطرح 1 من | أ | |
| = 0 و= 0 و = 0 | قف | ||
| ب | > 0 | اطرح 1 من أضف 1 إلى أضف 1 إلى | ب |
| = 0 | لا أحد | أ |
الحالة B عبارة عن حلقة تضيفلويتحرك أيضًالوالحالة A هي حلقة تحكم خارجية تكرر الحلقة في الحالة Bمرات. كما تعيد الحالة أ قيمةمنبعد اكتمال الحلقة في الحالة B.
يمكننا تطبيق الحالات باستخدام متغيرات جديدة كمؤشرات للحالة. ستكون مؤشرات الحالة B هيولاحظ أننا نحتاج إلى مؤشرين للتحكم في الحالة لحلقة واحدة؛ علامة أساسية () وعلم ثانوي (). نظرًا لأن كل مؤشر يتم استهلاكه كلما تم اختباره، فإننا نحتاج إلى مؤشر ثانوي ليقول "استمر في الحالة الحالية"؛ يتم تبديل هذا المؤشر الثانوي مرة أخرى إلى المؤشر الأساسي في التعليمات التالية، وتستمر الحلقة.
بإضافة مؤشرات حالة FRACTRAN وتعليماتها إلى جدول خوارزمية الضرب ، نحصل على:
| تعليمات FRACTRAN | الوضع الحالي | مؤشرات الدولة | حالة | فعل | الولاية التالية |
|---|---|---|---|---|---|
| أ | لا أحد | > 0 | اطرح 1 منأضف 1 إلى | أ | |
| = 0 و> 0 | اطرح 1 من | ب | |||
| = 0 و = 0 و > 0 | اطرح 1 من | أ | |||
| = 0 و = 0 و = 0 | قف | ||||
| ب | ، | > 0 | اطرح 1 من أضف 1 إلى أضف 1 إلى | ب | |
| = 0 | لا أحد | أ |
عند كتابة تعليمات FRACTRAN، يجب وضع تعليمات الحالة A في النهاية، لأن الحالة A لا تحتوي على مؤشرات حالة - فهي الحالة الافتراضية في حال عدم تعيين أي مؤشرات حالة. لذا، يصبح المضاعف في برنامج FRACTRAN كما يلي:
باستخدام المدخلات 2 أ 3 ب، ينتج هذا البرنامج المخرجات 5 أب . [ ملاحظة 2 ]

الطرح والقسمة
وبالمثل، يمكننا إنشاء "طارح" في FRACTRAN، وتتيح لنا عمليات الطرح المتكررة إنشاء خوارزمية "القسمة والباقي" على النحو التالي:
| تعليمات FRACTRAN | الوضع الحالي | مؤشرات الدولة | حالة | فعل | الولاية التالية |
|---|---|---|---|---|---|
| أ | ، | و | اطرح 1 من اطرح 1 منأضف 1 إلى | أ | |
| = 0 و > 0 | اطرح 1 من | X | |||
| = 0 | أضف 1 إلى | ب | |||
| ب | ، | > 0 | اطرح 1 من أضف 1 إلى | ب | |
| = 0 | لا أحد | أ | |||
| X | > 0 | اطرح 1 من | X | ||
| = 0 | قف |
عند كتابة برنامج FRACTRAN، نحصل على:
والمدخل 2 n 3 d 11 ينتج عنه المخرج 5 q 7 r حيث n = qd + r و 0 ≤ r < d .
خوارزمية كونواي الرئيسية
خوارزمية توليد الأعداد الأولية لكونواي المذكورة أعلاه هي في الأساس خوارزمية قسمة وباقي ضمن حلقتين. مع الأخذ في الاعتبار المدخلات بالشكل التالي:حيث 0 ≤ m < n ، تحاول الخوارزمية قسمة n + 1 على كل عدد من n إلى 1، حتى تجد أكبر عدد k يقسم n + 1. ثم تُرجع 2n + 1 7k - 1 وتُكرر العملية . لا ينتج عن سلسلة أعداد الحالات التي تُولدها الخوارزمية قوة للعدد 2 إلا عندما يكون k يساوي 1 (بحيث يكون أس 7 يساوي 0)، وهذا لا يحدث إلا إذا كان أس 2 عددًا أوليًا. يمكن الاطلاع على شرح مُفصّل لخوارزمية كونواي في هافيل (2007).
بالنسبة لهذا البرنامج، يتطلب الوصول إلى الأعداد الأولية 2، 3، 5، 7... على التوالي 19، 69، 281، 710،... خطوات (التسلسل A007547 في OEIS ) .
يوجد أيضًا شكل مختلف من برنامج كونواي، [ 1 ] والذي يختلف عن النسخة المذكورة أعلاه بكسرين:
هذا المتغير أسرع قليلاً: الوصول إلى 2، 3، 5، 7... يستغرق 19، 69، 280، 707... خطوة (التسلسل A007546 في OEIS ) . تستغرق دورة واحدة من هذا البرنامج، للتحقق من كون عدد معين N أوليًا، عدد الخطوات التالي: أينهو أكبر قاسم صحيح للعدد N وهي دالة الجزء الصحيح . [ 2 ]
في عام 1999، قدم ديفين كيلمنستر برنامجًا أقصر يتكون من عشر تعليمات: [ 3 ] بالنسبة للمدخل الأولي n = 10، يتم توليد الأعداد الأولية المتتالية بواسطة قوى متتالية للعدد 10.
أمثلة أخرى
برنامج FRACTRAN التالي:
يحسب البرنامج وزن هامينغ H( a ) للعدد الثنائي a، أي عدد الآحاد في التمثيل الثنائي للعدد a . [ 4 ] عند إدخال 2a ، يكون الناتج 13H ( a ) . يمكن تحليل البرنامج كما يلي:
| تعليمات FRACTRAN | الوضع الحالي | مؤشرات الدولة | حالة | فعل | الولاية التالية |
|---|---|---|---|---|---|
| أ | ، | > 1 | اطرح 2 من أضف 1 إلى | أ | |
| = 1 | اطرح 1 من أضف 1 إلى | ب | |||
| = 0 | لا أحد | ب | |||
| ب | لا أحد | > 0 | اطرح 1 من أضف 1 إلى | ب | |
| = 0 و > 0 | اطرح 1 من أضف 1 إلى | أ | |||
| = 0 و = 0 و > 0 | اطرح 1 من أضف 1 إلى | ب | |||
| = 0 و = 0 و = 0 | قف |
ملحوظات
- لا يمكن استخدام ترقيم غودل مباشرةً للأعداد الصحيحة السالبة، أو الأعداد العشرية، أو النصوص، على الرغم من إمكانية اعتماد اصطلاحات لتمثيل هذه الأنواع من البيانات بشكل غير مباشر. تشمل الإضافات المقترحة لـ FRACTRAN كلاً من FRACTRAN++ و Bag .
- ↑ تم وصف خوارزمية مضاعف مماثلة في صفحة Esolang FRACTRAN .
انظر أيضاً
مراجع
- جاي، ريتشارد ك. (1983). "آلة كونواي لإنتاج الأعداد الأولية" . مجلة الرياضيات . 56 (1). تايلور وفرانسيس : 26-33 . doi : 10.1080/0025570X.1983.11977011 .
- كونواي، جون هـ. (1987). "فراكتران: لغة برمجة بسيطة وعالمية للحساب". مشاكل مفتوحة في الاتصالات والحوسبة . سبرينغر-فيرلاغ نيويورك، ص 4-26. doi : 10.1007 / 978-1-4612-4808-8_2 . ISBN 978-1-4612-9162-6.
- كونواي، جون هـ.؛ جاي، ريتشارد ك. (1996). كتاب الأعداد . سبرينغر-فيرلاغ نيويورك، المحدودة. ISBN 0-387-97993-X.
- هافيل، جوليان (2007). غير مندهش! . مطبعة جامعة برينستون. ISBN 978-0-691-12056-0.
- روبرتس، سيوبان (2015). "معايير الفضيلة". العبقرية في اللعب - العقل الفضولي لجون هورتون كونواي . بلومزبري. ص 115-119 . ISBN 978-1-62040-593-2.
روابط خارجية
- محاضرة لجون كونواي: "فراكتران: لغة منطقية سخيفة"
- "علم أمراض الأعداد الأولية: فراكتران"
- وايسشتاين، إريك دبليو. "FRACTRAN" . عالم الرياضيات .
- علم أمراض الأعداد الأولية
- FRACTRAN - (Esolang wiki)
- تطبيق روبي وبرامج نموذجية
- مسألة مشروع أويلر رقم 308
- "بناء Fizzbuzz في Fractran من الأسفل إلى الأعلى"
- كريس لومونت، "مترجم عالمي لـ FRACTRAN في FRACTRAN"
- نماذج الحوسبة
- لغات البرمجة الباطنية
- الرياضيات الترفيهية
