맨위로가기

FRACTRAN

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

FRACTRAN은 정수의 소인수 지수를 레지스터 값으로 사용하는 계산 모델이다. 양의 분수 목록으로 구성된 FRACTRAN 프로그램은 각 분수를 입력 정수에 곱하여 정수를 생성하는 과정을 반복하며, 분수의 분모는 조건을, 분자는 연산을 나타낸다. FRACTRAN은 덧셈, 뺄셈, 곱셈과 같은 기본적인 연산을 포함하여 피보나치 수열 생성, 소수 생성 등 다양한 계산을 수행할 수 있으며, 특히 존 콘웨이가 제시한 소수 생성 프로그램이 유명하다.

더 읽어볼만한 페이지

  • 난해한 프로그래밍 언어 - HQ9+
    HQ9+는 간단한 인터프리터 구현이 가능한 난해한 프로그래밍 언어로, 'Hello, world!' 출력, 소스 코드 출력, "99 Bottles of Beer" 가사 출력, 누산기 값 증가의 네 가지 명령을 제공한다.
  • 난해한 프로그래밍 언어 - JSFuck
    JSFuck은 제한된 문자만을 사용하여 JavaScript 코드를 표현하는 난해한 프로그래밍 스타일로, 웹 보안 공격에 악용될 수 있으며, 기본값 조합과 `Function` 생성자를 활용하여 코드를 실행하고 난독화하여 악성 코드 탐지를 어렵게 만든다.
  • 계산 모형 - 양자 컴퓨터
    양자 컴퓨터는 양자역학적 현상을 이용하여 정보를 처리하는 컴퓨터로, 큐비트를 통해 0과 1을 동시에 표현하여 특정 연산에서 기존 컴퓨터보다 빠른 속도를 보이며 암호 해독, 신약 개발 등 다양한 분야에 혁신을 가져올 것으로 기대된다.
  • 계산 모형 - 양자 회로
    양자 회로는 양자 컴퓨팅에서 양자 논리 게이트들을 연결한 회로로, 큐비트의 양자역학적 특성을 활용하여 계산을 수행하며 양자 계산의 핵심 요소로서 연구가 활발히 진행되고 있다.
FRACTRAN

2. FRACTRAN 프로그램의 이해

FRACTRAN 프로그램은 괴델 넘버링을 사용해 입력값과 출력값을 하나의 소인수분해로 표현한다. 예를 들어 a=2, b=1, c=1 을 입력하면 2^2 \times 3^1 \times 5^1 와 같은 형태로 표현한다. FRACTRAN 프로그램은 인자 n의 소수 지수에 레지스터가 저장되는 일종의 레지스터 머신이며, 괴델 수를 사용하여 양의 정수 ''n''은 임의의 수와 크기의 양의 정수 변수부호화할 수 있다.

2. 1. 작동 원리

FRACTRAN 프로그램은 입력된 정수의 소인수 지수를 레지스터 값으로 사용하는 일종의 레지스터 머신으로 볼 수 있다.[1] 괴델 넘버링을 사용하면 양의 정수 ''n''은 여러 개의 양의 정수 변수를 인코딩할 수 있다. 각 변수의 값은 정수의 소인수 분해에서 소수의 지수로 표현된다. 예를 들어,

:60 = 22 × 31 × 51

위의 수는 v_2 변수가 2, v_3v_5 변수가 1의 값을 가지며, 다른 모든 변수는 0의 값을 갖는 레지스터 상태를 나타낸다.

FRACTRAN 프로그램은 양의 분수들의 정렬된 목록이다. 각 분수는 분모의 소인수로 표현되는 하나 이상의 변수에 대한 테스트를 나타낸다. 예를 들어:

:f_1 = 21/20 = (3 × 7) / (22 × 51)

위의 식은 v_2v_5를 테스트한다. 만약 v_2 ≥ 2이고 v_5 ≥ 1이면, v_2에서 2를 빼고, v_5에서 1을 빼고, v_3에 1을 더하고, v_7에 1을 더한다. 예를 들어:

:60 ⋅ f_1 = 22 × 31 × 51 ⋅ (3 × 7) / (22 × 51) = 32 × 71

FRACTRAN 프로그램은 분수 목록이므로, 이러한 테스트-감소-증가 명령은 FRACTRAN 언어에서 허용되는 유일한 명령이다. 또한 다음 제한 사항이 적용된다.

  • 각 명령이 실행될 때마다 테스트되는 변수도 감소한다.
  • 동일한 변수는 단일 명령에서 감소와 증가를 동시에 할 수 없다(그렇지 않으면 해당 명령을 나타내는 분수가 기약 분수가 아닐 것이다). 따라서 각 FRACTRAN 명령은 변수를 테스트하면서 소비한다.
  • FRACTRAN 명령은 변수가 0인지 직접 테스트하는 것은 불가능하다(그러나 특정 변수를 테스트하는 다른 명령 다음에 배치되는 기본 명령을 생성하여 간접 테스트를 구현할 수 있다.).[7]

2. 2. 제약 조건

FRACTRAN 프로그램은 양의 분수 목록으로 구성되므로, 테스트-감소-증가 명령만이 유일하게 허용되는 명령이다. 또한 다음과 같은 제약 조건이 따른다.[1]

  • 각 명령이 실행될 때마다 테스트되는 변수도 감소한다.
  • 동일한 변수는 단일 명령에서 감소되면서 동시에 증가될 수 없다. 이는 해당 명령을 나타내는 분수가 기약 분수가 아니기 때문이다. 따라서 각 FRACTRAN 명령은 변수를 테스트함과 동시에 소비한다.
  • FRACTRAN 명령은 변수가 0인지 직접적으로 테스트하는 것은 불가능하다. 그러나 특정 변수를 테스트하는 다른 명령 뒤에 기본 명령을 배치하여 간접적으로 테스트를 구현할 수 있다.

3. FRACTRAN 프로그래밍 예제

FRACTRAN은 기본적인 사칙연산을 수행할 수 있도록 프로그래밍될 수 있다. 예를 들어 덧셈, 뺄셈, 곱셈 등이 가능하다.
최댓값 구하기 프로그램a와 b를 입력하면 a와 b 중 더 큰 값을 출력하는 프로그램은 다음과 같다.

:(\frac{5}{6}, \frac{5}{2}, \frac{5}{3})
소수 생성 프로그램다음은 존 콘웨이가 제시한 소수 생성 프로그램이다.

:\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, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ...

이 수열은 2의 소수 거듭제곱을 포함한다.

: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
피보나치 수열 프로그램피보나치 수열을 생성하는 프로그램은 다음과 같다.

:\left( \frac{33}{91}, \frac{13}{11}, \frac{11}{1}, \frac{34}{399}, \frac{19}{17}, \frac{17}{1}, \frac{7}{2}, \frac{5}{187}, \frac{3}{1} \right)

3. 1. 덧셈 프로그램

3의 지수에 1을 더한다2의 지수 = 0정지



a와 b를 입력하면 다음과 같은 소인수분해 2^a 3^b가 입력된다. 이 프로그램은 다음과 같은 수열 2^{a-1} 3^{b+1}, 2^{a-2} 3^{b+2}...을 생성하다가, 결국에 3^{a + b} 곧, a+b 를 출력한다.

3. 2. 뺄셈 프로그램

FRACTRAN영어 프로그램에서 a에서 b를 빼는 프로그램은 \left( \frac{1}{6} \right)으로 표현된다. a와 b를 입력하면 2^a 3^b가 입력되며, 프로그램은 이 값에 \left( \frac{1}{6} \right)을 곱한다.

3. 3. 곱셈 프로그램

FRACTRAN에서 곱셈 프로그램은 두 자연수 a와 b를 입력받아 a와 b를 곱한 값을 출력한다. 이 프로그램은 다음과 같은 분수들의 목록으로 표현된다.

:\left( \frac{455}{33}, \frac{11}{13}, \frac{1}{11}, \frac{3}{7}, \frac{11}{2}, \frac{1}{3} \right)[2]

이 프로그램은 입력값 2^a 3^b에 대해 5^{ab}를 출력한다.[8]

프로그램의 작동 원리는 다음과 같다.

FRACTRAN
명령
상태상태
지표
조건동작다음 상태
\frac{3}{7}A없음v_7 > 0v_7에서 1을 빼고
v_3에 1을 더한다
A
\frac{11}{2}v_7 = 0 이고
v_2 > 0
v_2에서 1을 뺀다B
\frac{1}{3}v_7 = 0 이고
v_2 = 0 이고
v_3 > 0
v_3에서 1을 뺀다A
v_7 = 0 이고
v_2 = 0 이고
v_3 = 0
정지
\frac{5 \cdot 7 \cdot 13}{3 \cdot 11}, \frac{11}{13}Bv_{11}, v_{13}v_3 > 0v_3에서 1을 빼고
v_5에 1을 더하고
v_7에 1을 더한다
B
\frac{1}{11}v_3 = 0없음A




3. 4. 나눗셈 프로그램

FRACTRAN으로 뺄셈기를 만들 수 있으며, 반복적인 뺄셈을 통해 몫과 나머지를 계산하는 알고리즘을 구현할 수 있다.

FRACTRAN
명령어
현재 상태상태
지표
조건동작다음 상태
frac|7 · 13/2 · 3 · 11영어, frac|11/13영어Av_{11}, v_{13}v_2 > 0 이고
v_3 > 0
v_2에서 1 빼기
v_3에서 1 빼기
v_7에 1 더하기
A
frac|1/3 · 11영어v_2 = 0 이고
v_3 > 0
v_3에서 1 빼기X
frac|5 · 17/11영어v_3 = 0v_5에 1 더하기B
frac|3 · 19/7 · 17영어, frac|17/19영어Bv_{17}, v_{19}v_7 > 0v_7에서 1 빼기
v_3에 1 더하기
B
frac|11/17영어v_7 = 0없음A
frac|1/3영어Xrowspan="2" |v_3 > 0v_3에서 1 빼기X
v_3 = 0중지



위 표를 FRACTRAN 프로그램으로 작성하면 다음과 같다.

:(frac|91/66영어, frac|11/13영어, frac|1/33영어, frac|85/11영어, frac|57/119영어, frac|17/19영어, frac|11/17영어, frac|1/3영어)

2''n''3''d''11을 입력하면 5''q''7''r''을 출력하는데, 여기서 ''n'' = ''qd'' + ''r''이고 0 ≤ ''r'' < ''d''이다.

3. 5. 최댓값 구하기 프로그램

a와 b를 입력하면 a와 b 중 더 큰 값을 출력하는 프로그램은 다음과 같다.

:(\frac{5}{6}, \frac{5}{2}, \frac{5}{3})

4. 콘웨이의 소수 생성 알고리즘

존 콘웨이가 제시한 소수 생성 프로그램은 FRACTRAN의 대표적인 예시 중 하나이다. 콘웨이의 소수 생성 알고리즘은 본질적으로 두 개의 루프 내에서 몫과 나머지를 구하는 알고리즘이다. 이 프로그램으로 소수 2, 3, 5, 7 등을 얻기 위해서는 각각 19, 69, 281, 710 등의 단계가 필요하다.

1999년, 데빈 킬민스터(Devin Kilminster)는 더 짧은 10개의 명령으로 구성된 소수 생성 프로그램을 시연했다.[5]

:\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의 거듭제곱 형태로 생성한다.

4. 1. 알고리즘 개요

FRACTRAN 프로그램은 괴델 넘버링을 사용하여 입력값과 출력값을 하나의 소인수분해로 표현한다. 존 콘웨이가 제시한 소수 생성 프로그램은 다음과 같은 분수들의 목록으로 주어진다.

: (17/91, 78/85, 19/51, 23/38, 29/33, 77/29, 95/23, 77/19, 1/17, 11/13, 13/11, 15/2, 1/7, 55/1)

입력값 n=2에서 시작하여, 프로그램은 다음과 같은 수열을 생성한다.

: 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ...

이 수열에는 2의 소수 거듭제곱이 포함된다.

: 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 7^m (단, 0 ≤ ''m'' < ''n'')의 형태로 주어진 입력에 대해, 알고리즘은 ''n''+1의 최대 약수 ''k''를 찾을 때까지 ''n''+1을 ''n''에서 1까지의 정수로 각각 나누려고 한다. 그리고 2''n''+1 7''k''-1을 반환하고 반복한다. 이 알고리즘으로 생성되는 상태 번호 열에서 2의 거듭제곱을 생성하는 것은 k가 1일 때(7의 지수가 0이 되는 경우)이며, 이는 2의 지수가 소수일 때뿐이다.[3]

이 프로그램에서 소수 2, 3, 5, 7 등을 얻기 위해서는 각각 19, 69, 281, 710 등의 단계가 필요하다.

콘웨이 프로그램의 변형도 존재하며, 위의 버전과 두 개의 분수가 다르다.[3]

: (17/91, 78/85, 19/51, 23/38, 29/33, 77/29, 95/23, 77/19, 1/17, 11/13, 13/11, 15/14, 15/2, 55/1)

이 변형은 약간 더 빠르다. 2, 3, 5, 7 등을 얻는 데는 19, 69, 280, 707 등의 단계가 걸린다.

4. 2. 작동 방식

FRACTRAN 프로그램은 주어진 양의 정수와 분수 리스트를 이용하여 작동한다. 프로그램의 작동 방식은 다음과 같다.

1. 주어진 양의 정수를 시작으로, 분수 리스트에서 정수와 곱했을 때 정수가 되는 첫 번째 분수를 찾는다.

2. 해당 분수와 현재 정수를 곱하여 새로운 정수를 얻는다.

3. 새로운 정수를 가지고 1, 2번 과정을 반복한다.

4. 만약 리스트의 어떤 분수와도 곱하여 정수를 만들 수 없다면, 프로그램은 종료된다.

콘웨이의 소수 생성 알고리즘은 이러한 FRACTRAN 프로그램의 한 예시이다. 이 알고리즘은 본질적으로 두 개의 중첩된 루프 내에서 몫과 나머지를 구하는 알고리즘이다. 2^n 7^m (단, 0 ≤ ''m'' < ''n'') 형태의 입력이 주어지면, 알고리즘은 ''n''+1의 가장 큰 약수 ''k''를 찾을 때까지 ''n''+1을 ''n''부터 1까지의 각 숫자로 나누려고 시도한다. 그 후 2^{n+1}7^{k-1}을 반환하고 반복한다. 이 알고리즘에 의해 생성된 일련의 상태 숫자 중 2의 거듭제곱은 ''k''가 1일 때 (7의 지수가 0이 되는 경우)뿐이며, 이는 2의 지수가 소수일 때만 발생한다.[3]

콘웨이의 소수 생성 알고리즘은 다음과 같은 분수 리스트를 사용한다.

\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, 281, 710 단계가 필요하다.[3]

콘웨이 프로그램의 변형도 존재하며,[3] 위의 버전과 두 개의 분수가 다르다. 이 변형은 조금 더 빠르며, 2, 3, 5, 7 등을 얻는 데 19, 69, 280, 707 단계가 걸린다.[4]

4. 3. 소수 생성 프로그램의 변형

콘웨이의 소수 생성 프로그램에는 여러 가지 변형이 존재한다.[3] 다음은 그중 하나이다.

:(17/91, 78/85, 19/51, 23/38, 29/33, 77/29, 95/23, 77/19, 1/17, 11/13, 13/11, 15/14, 15/2, 55/1)

이 프로그램은 원래 프로그램보다 조금 더 빠르게 소수를 생성한다. 소수 2, 3, 5, 7을 얻기 위해 각각 19, 69, 280, 707 단계가 필요하다. 이 프로그램은 특정 숫자 ''N''이 소수인지 판별하기 위해 다음과 같은 단계 수를 거친다.[4]

: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년, 데빈 킬민스터(Devin Kilminster)는 더 짧은 10개의 명령으로 구성된 프로그램을 제시했다.[5]

:(7/3, 99/98, 13/49, 39/35, 36/91, 10/143, 49/13, 7/11, 1/2, 91/1)

이 프로그램은 초기 입력 ''n'' = 10에 대해, 연속적인 소수를 10의 거듭제곱으로 생성한다.

5. 다른 FRACTRAN 프로그램 예제

FRACTRAN은 다양한 알고리즘을 구현할 수 있는 독특한 프로그래밍 언어이다. 예를 들어 FRACTRAN으로 주어진 입력값의 이진수 표현에서 1의 개수를 계산하는 해밍 거리를 계산하는 프로그램을 작성할 수 있다.[6][12]

하위 섹션에 "해밍 거리 계산 프로그램"에 대한 자세한 설명이 있으므로, 여기서는 FRACTRAN을 활용한 다른 프로그램 예시가 있다는 점만 간략하게 언급하고 넘어간다.

5. 1. 피보나치 수열 생성 프로그램

FRACTRAN으로 피보나치 수열을 생성하는 프로그램은 다음과 같다.

:\left( \frac{33}{91}, \frac{13}{11}, \frac{11}{1}, \frac{34}{399}, \frac{19}{17}, \frac{17}{1}, \frac{7}{2}, \frac{5}{187}, \frac{3}{1} \right)

5. 2. 해밍 거리 계산 프로그램

다음 FRACTRAN 프로그램은 입력된 정수의 이진수 표현에서 1의 개수를 세는 해밍 거리를 계산한다.[6][12]

:\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)

2''a''가 입력으로 주어지면, 출력은 13H(''a'')이다. 여기서 H(''a'')는 ''a''의 이진수 표현에서 1의 개수이다. 이 프로그램은 다음과 같이 분석할 수 있다.

FRACTRAN 명령어현재 상태상태 지표조건동작다음 상태
\frac{3 \cdot 11}{2^2 \cdot 5}, \frac{5}{11}Av_5, v_{11}v_2 > 1v_2에서 2 빼기
v_3에 1 더하기
A
\frac{13}{2 \cdot 5}v_2 = 1v_2에서 1 빼기
v_{13}에 1 더하기
B
\frac{1}{5}v_2 = 0없음B
\frac{2}{3}B없음v_3 > 0v_3에서 1 빼기
v_2에 1 더하기
B
\frac{2 \cdot 5}{7}v_3 = 0 그리고
v_7 > 0
v_7에서 1 빼기
v_2에 1 더하기
A
\frac{7}{2}v_3 = 0 그리고
v_7 = 0 그리고
v_2 > 0
v_2에서 1 빼기
v_7에 1 더하기
B
v_2 = 0 그리고
v_3 = 0 그리고
v_7 = 0
중지


참조

[1] 웹사이트 Gödel numbering http://www.esolangs.[...]
[2] 웹사이트 Esolang FRACTRAN page http://www.esolangs.[...]
[3] 서적
[4] 서적
[5] 서적
[6] 웹사이트 Puzzle #4 http://golem.ph.utex[...]
[7] 웹사이트 ゲーデル数 http://www.esolangs.[...]
[8] 웹사이트 Esolang FRACTRAN page http://www.esolangs.[...]
[9] 서적
[10] 서적
[11] 서적
[12] 웹사이트 Puzzle #4 http://golem.ph.utex[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com