이 실험은 광자가 닿으면 터지는 폭탄에 대한 내용인데, 이 폭탄은 켜거나 끌 수 있다. 그런데 매우 신기한 것은, 이 폭탄이 켜져있는지 꺼져있는지 광자가 닿지 않아도 알 수 있는 방법이 존재한다. 그에 대한 실험이다(Kwiat et al, Phys, Rev. Lett. 74(24): 4763-4766, 1995년)
일반적인 빔 스플릿터 실험을 상정해보자. 왼쪽 아래에서 광자를 쏘면 거울과 반투명 거울을 사용해서 아래와 같이 구성할 수 있다. 그리고 이 셋팅에서는 모든 빛이 A로 진행하기 때문에 광자를 쏘면, A에서만 반응한다(반사시에 빛의 위상차가 변하면서 A로만 간다)
그런데 위에서 말한 켜진 폭탄을 특정 길에 배치해보자. 아래 그림과 같이 말이다. 그러면 절반의 확률로는 폭탄이 터지고 나머지 절반으로는 위와 같이 진행된다. 그런데 재미있는 것은 B가 반응할때이다.
전체적으로는 50%의 확률로 폭탄이 터지거나(그 길로 광자가 지나가거나), 아니면 폭탄이 터지지 않고 B나 A로 각각 25%의 확률로 감지되었을 경우가 생긴다. 그런데 어떤 광자를 쏴서 B가 감지되었다면 무슨 의미인가? 광자는 분명히 폭탄 근처에도 가지 않았는데 그 폭탄이 켜져있고 거기 있다는 것을 알려준다. 아래 영상에서의 마지막 그림이 그 사실을 말해준다.
놀랍지 않은가? 광자가 가지 않은 길의 정보까지 모두 반영되어 나타나기 때문이다. 즉 사실은 광자가 그 길을 가지 않았는데, 실제로는 간것처럼 작동하고 계산되어 마지막이 나타나게 된다. 대체 이 구조에서 인과란 무엇인가? 무엇이 일어나고 무엇이 일어나지 않았는가?
오랜 친구들과 만나면 블록체인 기반 암호화폐 이야기를 해주는데, 비록 코인 매수를 추천하지는 않더라도(변동성이 너무 심하다) 암호화폐의 가치를 단지 쓸모없는 허상에 거품으로 치부하는 것은 1차원적인 판단이라는 말은 꼭 해준다.
이 무용론은 예컨데 비트코인이 복사가 쉽고 단지 숫자뿐인 쓸모없는 허상이고, 어딘가 쓸데가 있는 금과는 다르다는 것이 가장 전형적이다. 전혀 가치가 없다는 말이다.
그러나 이 관점은, 현대사회의 많은 여러가지 구성요소의 본질을 이해하는데 별로 도움이 되지 않는 전통적인 사고방식이다. 이 복잡한 현대 사회는 각 참여자의 이해관계에 의해서 돌아가는 생태계를 이해하는게 중요하다. 즉 그 참여자들이 물려 돌아가는 것을 제각기 이해할때만 제대로 보인다.
첫번째, 무언가가 교환가치를 갖는 화폐로서의 신뢰를 갖게 만드는 것은 매우 어려운 일인데, 기적적으로 비트코인이 어떤 수 이상의 신뢰 그룹을 확보했다. 2010년대를 거치면서 탈중앙화를 부르짖는 일련의 그룹과 기술을 신봉하는 이들에 의해 그리 되었다. 이것은 지금봐도 신비롭다.
두번째, 이 비트코인은 완전히 투명하게 운영되며 유통량이 적정 수준을 넘지 않는다는 것이 보증된다.
세번째, 이제 신뢰를 확보한 이 비트코인이 화폐로서 금과 비교해보면, 온라인 화폐 관점에서는 피쳐폰을 쓰다가 스마트폰을 쓰는 느낌이다. 글로벌 송금이 보장되며 금보다 보관도 쉽고, 나눠서 사용하기도 좋다. 아이폰이 나오고 나서야 기존 스마트폰이 불편했던 것을 알게 되는 것처럼, 비트코인은 이 금이 얼마나 불편한지 깨닫게 해주었다. 금은 아주 작게 자를 수도 없고 보관을 하려면 경비가 필요하다. 송금같은 것은 없고 누구에게 보내려면 들고 가야한다. 그리고 언제나 순도를 의심해야 한다. 그런데 비트코인은 이런 모든 단점이 없다. 물론 개인이 사용하기에 불편한 점이 있지만, 몇가지 툴을 사용하면 어느정도 금의 불편함에 비길바는 아니다.
네번째, 이 화폐에 대한 참여자가 늘고 연관 서비스는 계속 성장한다. 그 화폐를 지원하는 서비스가 늘어나게 된다. 화폐 수요가 증가한다
이 틀에서는 갑자기 암호화폐가 기존에 존재하던 법정화폐들과도 경쟁을 시작하게 된다. 의외로 사람들은 가치를 저장하기 위해서 혹은 직접 쓰지는 않지만 뭔가 필요에 의해서 화폐를 교환하고 쌓아둔다. 그것을 법정화폐로 할지 아니면 암호화폐로 할지 고민하는 사람이 생기기 시작한다. 그리고 후자를 택하는 사람들을 위주로 지속적으로 생태계가 작동하게 된다. 물론 현재는 투기냐 아니냐 논쟁이 거센 가상자산 거래소를 위주로 유통되지만, 이제 2세대 3세대 블록체인 기술들이 송금/결재 이상의 것을 지원하게 되고 더 다양한 생태계를 끌어안게 된다.
따라서 암호화폐의 가치는 참여자 유입이나 관련 생태계의 성장 관점에서 볼 일이다. 규제가 그것을 억누르기도 하지만, 그 생태계의 성장이 다시 규제를 비껴가고, 사람들은 편리하고 효율적인 것을 한번 쓰면 다시는 돌아갈 생각이 없어진다. 이것이 수많은 규제의 위협 속에서도 암호화폐가 작동하는 방식이다. 이 세상에는 정부가 싫어하지만 사람들의 수요로 여전히 존재하는 시장이 없지 않다. 사람들은 필요를 충족시켜주는 더 좋은 서비스면 어떻게든 찾아내서 소비하기도 한다.
이런 마당에서 비트코인이 단지 숫자에 불과해서 무용하다는 의견은 역시 금도 단지 의미없는 금속조각이 아니냐는 비판과 별로 다를바 없다. 그 유명한 짐바브웨 달러를 생각해보면 법정화폐도 휴지가 되지 않는 건 아니다. 화폐가 법정통화이냐 혹은 손으로 만질 수 있거나 장신구로 쓰이는 금이냐 같은 것은 상황따라 평가받게 되고 역사 속에서 굳어진 것일 뿐이다. 더 중요한 것은 그것을 둘러싼 생태계가 어떤 방식으로 작동하고, 그것이 기존 것에 비해 얼마나 더 사람들에게 편리하고 잘 사용되는가 이다.
과거에 기대에 이 생태계를 보지 못하면 그저 새로운 세상이 계속 낯설 뿐이다. 암호화폐가 사라지고 다시 예전 통화로 돌아갈까? 아니다, 이제 화폐는 암호화폐보다 더 나은 디지탈 화폐로 대체될 수 있을 뿐이다. 다시 옛날의 구태의연한 화폐로 돌아가지 않는다. 어느 시장도 스마트폰을 버리고 피쳐폰으로 돌아가지 않는다. 정부가 규제해도 어떻게든 구해서 쓰게 되지 않겠는가. 그런 세상에 우리는 놓여있는 셈이다. 그래서 온 힘을 다해 이 생태계를 이해하려고 노력해야 변화를 바라보고 제대로 앞으로 나아갈 수 있다.
왜 수학에서는 소수(prime number)가 중요할까? 흔히들 소수는 숫자의 원자라고 한다. 1과 자기 자신 외에는 나누어 떨어지지 않으면서, 모든 수는 소수들을 몇번씩 곱하면 만들어지기 때문이다. 학생시절 배운 소수를 상기해보자.
수학을 하다보면 최소 공약수나 최소 공배수가 중요한 순간들도 있다. 그리고 매우 큰 수를 다루다보면 수를 분류하고 싶어지는데 이렇게 시도 하다보면 여지없이 만나게 되는게 이 소수이다. 그렇게 수학자들도 더 쉽고 단순화하다보면 소수를 만나게 된다. 그러면 소프트웨어 개발 관점에서는 이 소수가 어떤 의미를 지닐까? 물론 소수는 RSA 비대칭 암호화에서 핵심 역할을 수행하고 있지만, 그보다 더 본질적으로는 "최적화의 문제"에 이 소수가 등장할 수 있다.
대표적인 질문은, 수를 어떻게 하면 기계적으로 최적화해서 나타낼까? 이다.
아니 수를 어떻게 하면 최적화해서 나타내느냐고? 변수 하나 선언해서 하면 될 것이 아닌가. 라고 물을 수 있겠다. 그러나 부동소수점이나 여러가지 다양한 수를 나타내는 방법을 배웠거나 고민해본 사람은 이 문제가 그렇게 단순하지는 않다는 것을 알것이다.
우선, 가장 기본적으로는 컴퓨터는 정수를 2진수의 나열로 나타낸다. 컴퓨터에서 가장 기본이 아닐까 싶다. 모두가 아는대로
10(10진수) = 1010(2진수)
로 나타낼 수 있다. 순서를 갖는 2bit의 전압이 있고 없는 메모리 공간 4개를 저렇게 약속하면 된다. 그렇다 "약속"하면 된다.
( 이 숫자 체계를 이해함에 있어서 사실은 대칭이나 그 본질을 더 깊숙하게 이해하면 좋은데 아래 링크를 추천한다. 이 글이 곱씹을 만하다고 느껴지면 왜 대칭 체계에 소수가 역시 등장할 수 밖에 없는지 이 링크 글을 참조하기를 바란다 - https://infoengineer.tistory.com/31 )
정수와 관련하여 위와 같이 정의하면 간단히 끝날 일이기도 하다. 그런데 앞서 소개했듯이 소수를 이용하면 이 "약속"을 더 최적화할 수 있다. 즉, 수를 각 소수들의 곱으로 나타내는 일이다. 그리고 이것이 숫자의 원자가 필요한 이유이다. 원자는 그것을 분해하여 최적화할 수 있게 해준다.
10(10진수) = (5^1) * (2^1) (5를 한번, 2를 한번 곱하면 된다)
이를 테면 우리가 소수의 테이블을 prime 배열로 관리한다고 치면(ex> prime = {1,2,3,5,7,11,...}, 참고로 1은 소수에 포함을 안시키는 수학자가 많긴 하다.여기서는 편의상 포함시켰다.) 위 10진수의 10은,
prime[0] = 1
prime[1] = 2
prime[2] = 3
prime[3] = 5 ...
10(10진수) = prime[3]^1 * prime[1]^1
이렇게 나타낼 수 있다. 이렇게 해서 무슨 이득이 있을까? 더 복잡해 보일 수 있겠다. 하지만 가만히 생각해보라. 작은 수에서는 별 이득이 없겠지만 무한의 수를 다루면 장점은 엄청나다. 최소한의 비트만 가지고 매우 큰 수를 나타낼 수 있게 된다. 그리고 제곱하는 수 마저도 이렇게 소수를 이용해서 나타낼 수 있다. 10은
10(10진수) = prime[3]^prime[0] * prime[1]^prime[0]
이 된다. 예를 들면 소수로 된 숫자체계를 저렇게 테이블로 정의할 수 있고, 그렇게 되면 매우 큰 수를 최소한의 비트로 표현할 수 있게 된다. 한번 시험해보기 위해, 2^256 (2의 256제곱이다) 을 나타내보자. 이 숫자를 나타내려면 원래 방식대로라면 대략 2비트 256개가 필요하다. 10000....(2진수) 이렇게 나타내야 한다. 그런데 위 소수 진법(?)으로는
prime[1]^256 = prime[1]^(prime[1]^8)
= prime[1]^prime[1]^(prime[1]^3)
= prime[1]^prime[1]^prime[1]^prime[2]
이렇게 나타낼 수 있다. 몇가지 약속만 있으면 우리가 약속한 소수테이블을 4번 정도 참조하는 것만으로 2비트 256개의 표현을 4개의 비트로 절약될 수도 있는 셈이다. (이 숫자를 처리하기 위한 연산량의 많고 적음은 좀 나중에 고민할 수 있다. 우리는 지금 이성의 세계를 탐색하고 있으니 말이다. 그리고 사실은 우리가 컴퓨터를 전부 개조해서 모든 H/W가 매우 큰 수를 다루는 경우 저렇게 소수 단위로 처리하게 했다면 전세계의 컴퓨터 메모리와 디스크를 엄청나게 절약했을 수도 있다.)
앞 글에 소개한대로 대칭에 기반한 숫자체계를 단순하기 위해 고민하다보면, 이렇게 소수의 테이블을 참조하는 구현방식 외에 더 단순하게 나타내는 이론적이 없다는 것을 깨닫게 된다(수학자들이 수천년간 고민한 결과는 그렇다). 만약에 엔지니어가 이를 더 단순화할 수 있는 본질적인 방법을 발명해낸다면, 반대로 수학자에게는 수 체계의 새로운 지평을 열어줄 수도 있겠다.
자 그럼 이제 수학자들의 고민을 살펴보자. 그들은 여러 경로를 통해 이 소수에 관심을 갖게되었고 자연스레, 이 소수의 규칙을 찾고 있다. 가우스의 소수에 대한 다양한 추측이나 리만의 제타 함수들은 결국 이런 과정에서 탄생한 녀석들이다. 아주 쉽게 가우스는 우리가 규칙성이 없어서 테이블화한 저 소수에 대해 이런 규칙을 알고 있다. 대략 소수가 어찌어찌 분포한다는 근사 법칙이다.
바로 위 소수 테이블을 또다시 인코딩하여 더 단순화할 수 있게 된다. 현재로서는 2,3,5,7,11의 패턴은 그저 숫자를 하나하나 붙여서 테이블화 할 수 밖에 없다(테이블 말고는 이 배열을 정의할 방법이 없다). 만약에 저 수가 2,4,6,8,10 형태의 짝수이면 어떻게 되었겠는가? 곧바로 구태여 메모리를 잡아 먹는 저 소수 테이블을 없앨 수 있다는 사실을 알게 된다. 매우 큰 수에서 저 소수 테이블이 엄청나게 커지게 됨은 불을 보듯 뻔한데, 저 테이블을 유한한 숫자만으로 제한 할 수 있다거나, 없앨 수 있다면 굉장한 공헌이 아닐 수 없다. 수학자들에게 따라서 소수의 정확한 규칙(근사 말고)을 발견했다는 것은 소프트웨어 개발자에게 위의 메모리 최적화에 대한 답을 제공해주는 것과 동치의 발견이 된다.
조금 다르게 표현하면, 소수의 규칙을 발견했다는 것은, 위 소수 테이블을 더 단순화하여 숫자를 추가로 압축하여 나타낼 수 있다는 의미가 된다. 메모리와 디스크가 획기적으로 줄어든다! 그런데 결론은 아직은 정확한 규칙이 밝혀지지 않았다.
다만, 위 가우스의 소수 정리 등을 가지고도 좀 근사해서 개발 할 수는 있다. 억지로 소수 테이블을 저 소수 정리에 나오는 로그의 규칙을 따라 정의하면, 예를 들어 n번째 소수를 "log(n)+무언가" 같은 것으로 가정한 후 숫자를 표기하는 것이다. 물론 값은 실제 값이 아니라 들쑥날쑥 조금씩 다르겠다. 대신에 큰 수를 다룰 때 필요한 엄청 큰 크기의 소수 테이블은 없앨 수도 있다. 하지만 소수의 법칙이 제대로 발견되지 전까지는 소수 정리가 보여주는 불규칙성을 그대로 내재하게 된다. 사실 지금까지 발견된 근사한 소수의 법칙으로는 제대로 쓸 수 있는 소프트웨어를 만들 수 없는 것이 현실이다. 그저 단순히 값이 많이 틀려도 되는 단순 예측, 추세 확인 정도나 할 수 있겠다.
오늘 시작한 주제는 여기 까지이다. 이렇게 수학의 몇몇 주제를 소프트웨어 개발 관점에 바라보면 수학자들이 논의하는 의미를 알아차리기 힘들거나 어려워 보이는 일들이, 실제 어떤 의미를 지니는 지 더 확실하게 알 수 있다. 필자가 발견한 것은 소프트웨어 개발이라는 것은 자연과학의 기계적 관점을 체화하여 경험하는 일이기 때문에, 사실은 수학자와 같은 논리적인 생각을 할 수 있고 그 주제를 더 잘 이해할 수 있는 수학 친화적인 직업이라는 점이다. 그래서 최적화를 고민하게 되면 늘 수학자들이 고민하는 최전선을 경험하는 일로 이어진다.
오늘은 몇가지 주제 중에서 소수가 어떤 의미를 지니는지, 소수가 무엇을 할 수 있는지, 소수의 규칙을 발견하는 일이 어떤 것인지 간단히 다루어 보았다. 모든 것이 가만히 보면 이렇게 최적화와 연관이 된다. 그리고 이 다음시간에는 섀넌의 정보이론에 나오는 압축에 대한 내용을 살펴보자. 압축으로 이해하면 이 무슨 이야기인지 모를 내용이 너무 당연한 것으로 다가오게 된다.