Problems and Solutions #006 [Matlab 코드]

written by jjycjn   2016. 8. 3. 13:16

Problem #006

$2^n$의 첫 네자리의 숫자가 $2016$이 되게 하는 $n$이 존재함을 보여라.


위 문제에 대한 증명은 http://jjycjnmath.tistory.com/265에서 확인할 수 있다. 이 증명에 따르면 위 문제의 조건을 만족하는 $n$의 존재성은 알 수 있지만 실제로 어떻게 $n$을 구할 수 있는지는 알 수가 없다. 그래서 Matlab을 이용하여 $n$을 구하는 알고리즘을 작성해 보았다. 코드는 다음과 같다.

n=10; a=1024; b=0;
while b ~= 2016
    n = n+1; a = 2*a; % a = 2^n
    % number a를 string으로 변환한 뒤 첫 4개의 숫자만을 호출
    c = num2str(a);
    b = str2num(c(1:4));  
    if a > 10^10 % a의 결과값이 10^10 이상으로 커지는 것을 방지
        a = a/(10^7);
    end
end

위의 알고리즘을 Matlab으로 구동해 보면 $n$의 값이 $7286$이라고 나온다. 실제로 $2^{7286}$의 첫 네자리의 값이 $2016$인지를 확인하기 위해서 Matlab으로 이 값을 계산해 보려고 했지만, Matlab에서는 $2^{1024}$이상의 값은 모두 inf로 처리해 버린다. (300 자리가 훨씬 넘는 값이니 당연한듯 하기는 하다.) 그래서 어떻게 하면 $2^{7286}$의 값을 구할 수 있을까 하고 구글링을 해본 결과 John D'Errico가 만든 Variable Precision Integer Arithmetic Add-on을 설치하여 이 문제를 간단히 해결할 수 있었다! 먼저 Add-on을 Matlab에 설치한 후, 간단히 다음의 코드

vpi(2)^7286

를 실행해 주기만 하면 된다. 그러면 결과는 아래와 같다.

ans =
20162686975029432569631266722422286872065144385276
34688119217580977467233935804009606841419827084398
15044728255145850718801238219802215098834238757476
56967376984042061248038222475020038360330504892591
82598583998412491437146451479771926121154533964358
89561576874201093425246080680937034182302127647669
15338323396729924380171678474403116426711616088155
32037451822294179524049754795645930593282522943726
51327873677068787158057471239551171416335431890930
61737458451330418940248737282170964615399321630388
72812306964862132269745191272226058563267902765615
21697352575504431110687787762222011401520419658721
14290050732890223888536244465494520138946798562301
35741834878587011967972035269616872320760678461805
91973097026516328205150201280404015002864272662438
12380923875934433633014660407583896176074054765436
92646543687687824333487743571693643642789109553342
49468507536713322876052203994592069784872950962140
80210398761412617257894783805369667205670311465100
79198039675872705920680370420197654701893170127761
79684487026366620903972415560070970203287968643888
99834517325792929043972233150069738061842416592494
47184513828390296098238965837936033142782028015847
13225444693790679551553710165427722145340301554243
72161283399567946552980088359134343934728154938628
27663463540527582551706172583891080720587106554884
13861688050627100766700199380684894944705832105988
41383942055625282515733262166278173710503947071629
24770210306697200266814084559369712509098894430595
47042163334027795575003087971908191958894846763194
31929547027102167366146515466297718663203897583481
48222239387212410597425690564256097173560373211124
13415933048338138266996052250756801893116006259070
34168067682452909693300831137306289980155200271344
33248735689583372277424197149088669833780032362375
56268136767196010641392919202154746876325310699333
76099962423438713885466457365013917142012252702757
81219850242260438509852130819576158150122018303180
98404473879283611896546982800967445826198599472315
91097004537081075931471058467906093320634421581250
03180804573480908367455560476703739314258335489387
24354592153208768607296982389645468432408722190622
32738228532281389497875303532327574548664407705653
97900443602095413509182535516751789517963264

총 $2019$자리의 숫자이고 첫 네자리의 숫자가 $2016$임을 확인할 수 있다. 따라서 위에 간단하게 작성한 알고리즘이 잘 작동하는걸 알 수 있다. 이 Add-on에는 이 외에도 여러가지 함수가 내장되어 있다고 하는데, description에 적혀있는 함수 중에 하나는 "주어진 숫자를 영어로 읽어주는" 함수이다. (코드를 살펴보았더니 $10^{306}$ 이하의 숫자까지는 모두 영어로 읽어줄 수 있는 것 같다.)

>> vpi2english(vpi('1234567890'))
ans =
one billion, two hundred thirty four million, five hundred sixty
seven thousand, eight hundred ninety


  ::  
  • 공유하기  ::