Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

고정밀도 연산방식으로 준정수 구하기

PSLQ 알고리즘과 같은 정수 관계를 구하는 알고리즘[1]은 정확한 결과 산출을 위해 고정밀도 연산방식을 필요로 합니다. 알고리즘에 대한 입력값의 정밀도가 높아질수록 알고리즘이 수치적 아티팩트 대신 정수 관계를 구할 가능성이 높아집니다. PSLQ 알고리즘에서는 거짓양성(예: 준정수로 인한 거짓양성)이 발생할 수 있습니다.

이 예제에서는 Symbolic Math Toolbox™의 가변 정밀도 연산방식을 사용하여 준정수(즉, 정수에 매우 가까운 숫자)를 구하는 방법을 보여줍니다. 이 예제에서는 정수 n=1, ...,200에 대해 exp(πn) 또는 exp(π n) 형식을 취한 준정수(또는 근사 정수)를 구합니다.

먼저, 준정수[2]의 잘 알려진 예인 실수 exp(π163)을 살펴보겠습니다. 이 실수를 정확한 기호 숫자로 만듭니다.

r = exp(pi*sqrt(sym(163)))
r = eπ163

vpa를 사용하여 가변 정밀도 연산방식으로 이 숫자를 계산합니다. 기본적으로 vpa는 32자리의 유효 자릿수로 값을 계산합니다.

vpa(r)
ans = 262537412640768743.99999999999925

digits를 사용하여 유효 자릿수를 더 높은 정밀도로 변경할 수 있습니다. 동일한 숫자를 40자리의 유효 자릿수로 계산합니다.

digits(40)
vpa(r)
ans = 262537412640768743.9999999999992500725972

이 숫자는 정수에 매우 가깝습니다. 이 실수와 이 실수에 가장 가까운 정수 간의 차이를 구합니다. vpa를 사용하여 이 결과를 40자리의 유효 자릿수로 계산합니다.

dr = vpa(round(r)-r)
dr = 0.0000000000007499274028018143151532171817442410122968

다음으로, 정수 n=1, ...,200에 대해 exp(πn) 형식을 취한 준정수를 구합니다. 이 수를 정확한 기호 숫자로 만듭니다.

A = exp(pi*sqrt(sym(1:200)));

exp(π200)의 정수부에 소수점 이하 20자리를 더한 자릿수를 유효 자릿수로 설정합니다.

d = log10(A(end));
digits(ceil(d) + 20)

이 일련의 숫자와 그러한 숫자에 가장 가까운 정수 간의 차이를 계산합니다. 반올림 오차가 0.0001 미만인 준정수를 구합니다. 결과를 정확한 기호 형식으로 표시합니다.

B = vpa(round(A)-A);
A_nearint = A(abs(B)<0.0001)'
A_nearint = 

(eπ37eπ58eπ67eπ163)

소수점 이하 20자리 이상의 정밀도로 준정수를 계산합니다.

A_nearint = vpa(A_nearint)
A_nearint = 

(199148647.999978046551856766500923875335924591257751.99999982221324146957619235527147197952743.9999986624542245068292613126262537412640768743.9999999999992500725972)

차이에 대한 히스토그램을 플로팅하여 해당 분포를 표시합니다. 이 분포는 0에 가까운 차이가 많이 발생함을 보여줍니다. 여기서 준정수는 exp(πn) 형식입니다.

histogram(double(B),40)

Figure contains an axes object. The axes object contains an object of type histogram.

다음으로, 정수 n=1, ...,200에 대해 exp(π n) 형식을 취한 준정수를 구합니다. 이 수를 정확한 기호 숫자로 만듭니다.

A = exp(sym(pi)*1:200);

exp(π200)의 정수부에 소수점 이하 20자리를 더한 자릿수를 유효 자릿수로 설정합니다.

d = log10(A(end));
digits(ceil(d) + 20)

이 일련의 숫자와 그러한 숫자에 가장 가까운 정수 간의 차이를 계산합니다. 반올림 오차가 0.0001 미만인 준정수를 구합니다. 결과는 비어 있는 sym 배열이며, 이는 이 조건을 만족하는 준정수가 없음을 의미합니다.

B = vpa(round(A)-A);
A_nearint = A(abs(B)<0.0001)
 
A_nearint =
 
Empty sym: 1-by-0
 

차이에 대한 히스토그램을 플로팅합니다. 히스토그램은 비교적 균일한 분포를 나타내고 있으며 exp(π n) 형식에서는 준정수가 많이 발생하지 않음을 보여줍니다. 이 구체적인 예에서는 반올림 오차가 0.0001 미만인 준정수가 없습니다.

histogram(double(B),40)

Figure contains an axes object. The axes object contains an object of type histogram.

마지막으로, 추후 계산을 위해 32자리의 유효 자릿수의 디폴트 정밀도를 복원합니다.

digits(32)

참고 문헌

[1] “Integer Relation Algorithm”, In Wikipedia, April 9, 2022. https://en.wikipedia.org/w/index.php?title=Integer_relation_algorithm&oldid=1081697113.

[2] “Almost Integer”, In Wikipedia, December 4, 2021. https://en.wikipedia.org/w/index.php?title=Almost_integer&oldid=1058543590.

참고 항목

| |

관련 항목