FRACTRAN

FRACTRAN

FRACTRAN este un limbaj de programare exotic și complet Turing aplicabil întregilor naturali . A fost inventat de matematicianul John Conway, care a publicat o descriere a acestuia în 1987.

Constă în reprezentarea oricărei funcții calculabile pe numere întregi printr-o listă de fracții .

Pentru a găsi imaginea unui număr întreg A, căutăm în listă prima dintre fracțiile care înmulțite cu A dă un număr întreg B, apoi aplicăm procedura din nou întregului B. Dacă niciuna dintre fracțiile listei înmulțite cu rezultatul precedent nu dă un număr întreg, procedura se oprește.

Exemplu

Luați în considerare programul FRACTRAN corespunzător listei de fracții .

Dacă este aplicat întregului 14, nici ca și nici nu sunt întregi, programul se oprește imediat.

Dacă îl aplicăm întregului 15, obținem succesiv 20 (pentru că numai unul este un număr întreg), apoi 6 (pentru că este un număr întreg), apoi 8 (pentru că doar unul dă un număr întreg), atunci procedura se oprește.

Principiu

Principiul se bazează pe existența unei descompuneri în produse a factorilor primi ai numerelor întregi și pe noțiunea de evaluare p-adică .

Fiecare număr întreg A are o descompunere unică a factorului prim în care exponentul numărului prim p se numește evaluarea lui p în A și se notează .

Pentru un număr întreg A dat, toate sunt zero, cu excepția unui număr finit din ele. Înmulțirea numărului întreg A cu o fracție care permite obținerea unui număr întreg B, constă în operarea adunărilor și scăderilor pe .

Astfel, lista precedentă funcționează pe evaluările de 2, 3 și 5. Prima fracție elimină 1 din evaluările de 2 și 5 (dacă este posibil) și crește cu 1 valoarea de 3, a doua fracție acționează numai atunci când evaluarea de 2 sau 5 este zero, crește evaluarea de 2 cu două unități și scade cea de 3 cu o unitate.

Când A este scris cu A 'prim cu 30 și , folosind două bucle, procedura transformă A în apoi în și apoi se oprește.

Programul face astfel posibilă definirea operațiunilor asupra evaluărilor.

Operațiuni de bază

Plus

Lista care conține fracția unică face posibilă sumarea evaluărilor de 2 și 3: când A este scris cu A 'prim cu 6, procedura se aplică până când A este transformat în .

Multiplicare

Putem crea o funcție multiplicativă folosind o buclă aditivă. Pentru aceasta, este necesar să se introducă noțiunea de stare în algoritm. Acest algoritm se aplică unui număr și îl transformă în și funcționează la evaluările de 2, 3, 5, dar și 7, 11 și 13:

Starea curenta Condiție Acțiune Următoarea stare
LA v7> 0 Scădeți de la
1 la v7 adăugați 1 la v3
LA
v7 = 0 și
v2> 0
Scădeți 1 din v2 B
v7 = 0 și
v2 = 0 și
v3> 0
Scădeți 1 din v3 LA
v7 = 0 și
v2 = 0 și
v3 = 0
Stop
B v3> 0 Scădeți 1 din v3
Adăugați 1 în v5
Adăugați 1 în v7
B
v3 = 0 Nimic LA

Starea B este o buclă care adaugă v3 la v5 și, de asemenea, mută v3 la v7, iar starea A este o buclă care repetă bucla B v2 de ori. Starea A returnează, de asemenea, la v3 valoarea inițială (prezentă în v7) când bucla B este terminată.

Pentru a gestiona aceste stări, sunt necesare noi variabile: ele joacă rolul de indicatori de stare. Semnalizatoarele de stare pentru bucla B sunt v11 și v13. Sunt necesari doi indicatori de stare pentru bucla unică B: într-adevăr, primul indicator (v11) fiind consumat la intrarea buclei, este necesar să aveți un al doilea indicator (v13) pentru a indica programului că trebuie să continue în aceeași stare. Semnalizatorul v13 este comutat la v11 în timpul instrucțiunii „următoare” a buclei.

Prin adăugarea indicatorilor de stare și a instrucțiunilor în tabelul algoritmului de multiplicare, obținem:

instructiune
fractran
Starea curenta Indicatori de
stare
Condiție Acțiune Următoarea stare
LA Nu v7> 0 Scădeți 1 din v7
Adăugați 1 din v3
LA
v7 = 0 și
v2> 0
Scade 1 din v2
Setați v11 la 1
B
v7 = 0 și
v2 = 0 și
v3> 0
Scădeți 1 din v3 LA
v7 = 0 și
v2 = 0 și
v3 = 0
Stop
B v11, v13 v3> 0 Scădeți 1 din v3
Adăugați 1 în v5
Adăugați 1 în v7
B
v3 = 0 Setați v11 la 0 LA

Atunci când scriem lista instrucțiunilor FRACTRAN, trebuie să punem ultimele instrucțiuni ale stării A, deoarece starea A nu are indicator de stare, este starea implicită.

Astfel, programul de multiplicare FRACTRAN este următoarea listă:


Dacă introduceți numărul , programul revine .

Substracție

Fracția simplă transformă numărul în


Diviziunea euclidiană

Diviziunea euclidiană a unui prin b ( a și b numere naturale, b > 1) este dat de două naturale numere q și r astfel încât r < b și a = bq + r . Această divizare euclidiană poate fi văzută ca o buclă de scăderi: împărțirea a lui b este de a scădea b dintr - o cât de multe ori este necesar, numărul de ori această scădere se efectuează corespunde q , ultima valoare într - o potrivește cu restul.

Algoritmul funcționează apoi pe v2 conținând a , v3 conținând b , v5 destinat să conțină q și v7 destinat să conțină r . Aceste variabile sunt completate de 4 indicatori de stare v11, v13, v17, v19.

Programul FRACTRAN care urmează este format din trei stări:

Instrucțiuni
FRACTRAN
Starea curenta Indicatori de
stare
termeni si conditii Acțiuni Următoarea stare
LA v11, v13 v2> 0 și
v3> 0
Scade 1 din v2
Scade 1 din v3
Adăugați 1 din v7
LA
v2 = 0 și
v3> 0
Scade 1 din v3
Setați v11 la 0
X
v3 = 0 Adăugați 1 la v5
Setați v11 la 0
Setați v17 la 1
B
B v17, v19 v7> 0 Scădeți 1 din v7
Adăugați 1 din v3
B
v7 = 0 Setați v11 la 1
Setați v17 la 0
LA
X v3> 0 Scădeți 1 din v3 X
v3 = 0 Stop

Scrierea programului este apoi:

Trebuie doar trebuie să introduceți pentru a ajunge la ieșire în cazul în care cu .

Generarea de suite

Unele programe se bucură la nesfârșit și generează secvențe infinite.

Algoritmul lui Conway al numerelor prime

Următorul program este prezentat de John Conway în cartea co-autoră cu Richard Guy Cartea numerelor . John Conway le numește „The Fantastic 14 Fractions” .

Acest program, aplicat întregului 2, generează o succesiune care conține toți termenii formei unde este un număr prim . În schimb, orice putere de 2 din această succesiune are un exponent de 1 sau un număr prim. Această continuare este numită jocul primar Conway .

Algoritmul este în esență un algoritm de diviziune euclidiană. Principiul este următorul: pornind de la un număr de forma unde 0 ≤ m < n , încercările algoritm divide n +1 prin toate numerele de la n la 1, până când se găsește cel mai mare număr întreg k astfel încât k se divide n + 1 și apoi se întoarce . Singurele cazuri în care algoritmul returnează o putere de 2 sunt cazurile în care k = 1, adică cazurile în care n +1 este prim.

Secvența Fibonacci

Următorul program:

aplicat întregului 3, generează o succesiune care conține toți termenii formei în care a și b sunt doi termeni consecutivi ai secvenței Fibonacci . În schimb, orice termen al secvenței formei are ca exponent doi termeni consecutivi ai secvenței Fibonacci.

Algoritmul este în esență un algoritm de adăugare care constă, începând de la furnizare .

Demonstrație

Într-adevăr :

 

Suita Syracuse

Acest program prezentat de Kenneth G. Monks:

aplicat la , generează o secvență care conține succesiv toți termenii , unde b parcurge termenii secvenței Syracuse din primul termen N. În schimb, orice putere de 2 din această secvență are pentru exponent un element al secvenței Syracuse.

Demonstrație Astfel, exponentul N a fost modificat la N / 2 dacă N este par și (3N + 1) / 2 dacă N este impar, care este principiul secvenței Syracuse.  

Ideea lui Kenneth Monks este de a studia secvențele ciclice Syracuse căutând proprietățile secvențelor ciclice generate de acest program.

Program universal

Conway a definit, de asemenea, un program universal FRACTRAN, format din următoarele fracțiuni:

Putem arăta apoi că, pentru orice funcție recursivă parțială f , există un număr întreg c astfel încât, pentru orice număr întreg n , prin aplicarea programului FRACTRAN cu lista de mai sus la număr , ajungem la numărul dacă și numai dacă calculul f ( n ) se termină. Această proprietate arată că obținem în FRACTRAN toate funcțiile calculabile.

Note și referințe

Note

  1. În articolul FRACTRAN: Un simplu limbaj universal de programare pentru aritmetică , publicat în cartea lui Cover și Gopinath, Probleme deschise în comunicare și calcul , Springer-Verlag, New York, (1987), p. 4-26.
  2. (în) Algoritmi similari sunt descriși în această pagină .
  3. Pentru o explicație detaliată, vezi Julian Havil, Nonplussed!: Mathematical Proof of Implausible Ideas , Princeton University Press , 2007, ( ISBN  978-0691120560 ) .

Referințe

  1. Julian Havil, Nonplussed!: Mathematical Proof of Implausible Ideas , p. 162-163.
  2. A se vedea continuare A007542 din OEIS .
  3. (ro) [PDF] Kenneth G. Monks, „  3x + 1 minus +  ”, în Matematică discretă și informatică teoretică 5, 2002 47-54.

Vezi și tu

Articole similare

Resurse bibliografice

<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">