3D 프로그래밍에서 사원수 제거?

몰랐는데 3D 그래픽 프로그래밍에서 Quaternion이 상당히 많이 쓰인다고 한다. 헐. 이런 쓸데없어 보이는 게 실용적 용도가 있으리라고는 꿈에도 몰랐네-_-

아시다시피 Quaternion은 복소수를 확장한 수집합인데, 공간상의 회전을 구현할 때 3D 게임그래픽 엔진에 널리 쓰이는 것 같다. 아마 3D 그래픽 프로그래머들은 많이 배우시는 듯.

해커뉴스[1]에서 3D엔진에서 사원수를 제거하자는 취지의 글[2]이 올라와 있던데, 이미 3D 그래픽 프로그래머들 사이에서 나름 논란적인 주제[3]인 것 같다. 사실 복소수도 현실과의 거리감이 있는 수라는 느낌이 드는데, 복소수를 확장한 number system의 괴이한 operation을 공부해서 프로그래밍하는 것에 거부감을 느끼는 것도 무리는 아닐 듯 하다. ㅎ

글[2]을 대충 봤는데, bivector를 써서 수학적으로 사원수를 회피하는 방법을 구현하는 것 같다. bivector는 처음 봤네. ㅎㅎㅎ 유명한 개념은 아닌 듯 하다.

사이트[2] 주인이 유튜브 영상[4]도 만들었으니, 그 정성은 인정해줄만 하다. ㅎㅎ 개인적으로는 지식을 학습할 때 영상을 보는 건 핵심을 알기가 답답해서, 글로 읽는 것을 더 선호함.

근데 bivector를 공부할 정도면 그냥 quaternian을 공부해도 무리는 없지 않을까 싶다-_- 어차피 수학적 난해함에 거부감이 있어 quaternian을 거부하면, bivector의 vector calculus도 거부감은 똑같을 것 같다. ㅎㅎㅎ

.


[1] Let’s remove Quaternions from every 3D Engine (hacker news)
[2] Let’s remove Quaternions from every 3D Engine (marctenbosch.com)
[3] Do We Really Need Quaternions? (gamedev.net)
[4] Let’s remove Quaternions from every 3D Engine (Intro to Rotors from Geometric Algebra) (youtube 15분 27초)

세익스피어 작품 전체를 하나의 이미지로 압축하기

해커뉴스[1]에서 신박한 글을 봐서 포스팅해봄. ㅋㅋㅋ

트위터에 어떤 사람이 1.93MB 크기의 이미지 파일 하나를 올렸는데[2], 그 이미지 바이너리를 zip형식으로 압축을 풀면(unzip shakespeare.zip), 64,512바이트 크기로 쪼개진 rar 분할압축파일 31개가 된다. 이것의 압축을 다시 풀면 (unrar e shakespeare.part001.rar) 6.7MB 크기의 html 파일 하나가 되는데, 이것에 세익스피어 전체 작품이 텍스트로 들어있다고 한다. 헉!!

근데 윈도우즈의 반디집[3]으로는 잘 안되는 것 같은데, 다른 압축 프로그램은 확인해보지 않았다. 라즈비안에서 unzip, unrar 커맨드로 압축을 푸니까 잘 된다.

신박한 점은 데이터를 최종적으로 압축한 파일의 이미지가 다시 세익스피어의 초상화가 된다는 부분인데, 무슨 트릭을 쓴 건지 모르겠지만 대단하구만. 게다가, sns에 이미지를 올리면 sns서버에서 자체적으로 이미지 재처리를 하는 것이 보통인데, 트위터는 작은 이미지는 전혀 재처리를 하지 않는 듯 하다.

일전에 불법 소수[4] 이야기도 했지만, 동일한 정수값으로 데이터를 전달하는 다양한 트릭에 대해 생각하게 만든다.

여하간 완전 신박하구만. 세상은 넓고 재주있는 사람은 많다 ㅎㅎㅎㅎ

.


2018.10.31
해커뉴스 댓글[1]을 보니 러시아에서 раржпег 이라는 이름으로 이미 잘 알려진 트릭인 듯 하다. 물론 раржпег는 rarjpeg를 키릴문자로 직접 바꾼 말이다. ㅋ 역시나 하늘 아래 새로운 생각은 별로 없다. ㅋㅋ 어느 사이트[5]에 예시 이미지 파일들을 소개하고 있다. 이미지들을 rar 확장자로 저장하여 압축을 풀면 다른파일이 된다. 본인의 초 짧은-_- 러시아어 실력으로 картинка с сюрпризом는 이미지 속의 놀라움이라는 뜻인 듯.

.


[1] JPEG image of Shakespeare which is also a zip file containing his complete works (hacker news)
[2] https://mobile.twitter.com/David3141593/status/1057042085029822464
[3] Windows용 반디집 (kr.bandisoft.com)
[4] 내 백과사전 불법 소수 illegal prime number 2013년 10월 18일
[5] Rarjpeg — картинка с сюрпризом (netlore.ru)

에이다 러브레이스의 최초의 프로그램을 파이썬으로 구현하기

주요 메이저 프로그래밍 언어 중에서 오직 파이썬만이 상승세를 타고있다는 이코노미스트지의 기사[1]를 봤는데, 파이썬이 진짜 인기가 높긴 높은 것 같다. 뭘 했다하면 다 파이썬이다. ㅋ

에이다 러브레이스는 최초의 프로그래머로서 널리 알려져 있는 사람인데, 그녀에 대한 소소한 트리비아는 Sydney Padua[2]에 잘 나와있으니 참고 바란다. ㅎ Wolfram 선생이 와이어드지에 기고한 기사[3]에 전반적인 설명이 잘 돼 있다. 근데 글이 넘 길어서 영어 울렁증이 있으니 힘들다-_- 그녀가 기여한 업적이 과장되어 있다는 논란도 좀 있는 듯.

저번달에 그녀가 작성한 알고리즘이 담긴 책이 Moore Allen & Innocent 옥션하우스에서 95000파운드에 낙찰됐다[4]고 하는데, 아마 이 숫자는 해머 프라이스인듯 하고, 실제 지불가격은 114,000 파운드라고 한다.[5] 일반적으로 옥션에서 물건이 거래되면 해머 프라이스에서 바이어 프리미엄으로 10~30%를 더 지불한다. 초 비싸네 ㅋㅋ

그런데 그녀가 작성한 그 최초의 ‘프로그램’은 무엇을 하는 계산인가? 계산 절차를 작성한 노트가 여러 장이 있는 모양인데, 그 중에 note G에 있는 베르누이 수를 계산하는 절차가 최초의 프로그램으로 인정되는 것 같다. 근데 어떤 절차로 베르누이 수를 계산하는 건지 원본 노트를 암만 봐도 이해가 전혀 안 되던데, 이 절차를 파이썬으로 구현한 사람이 알고리즘을 설명한 글[6]을 봤다. 역시나 또 파이썬인가. ㅋ

다음 점화식을 활용해서 순차적으로 구하는 것 같다.

\displaystyle B_n = \frac{1}{n+1}\sum_{k=0}^{n-1}\binom{n+1}{k}B_k

참고로 Note G에 네 번째 계산 절차에서 v5 / v4는 오타라고 한다. 정확히는 v4 / v5가 되어야 하는데, 이걸 두고 해커뉴스[7] 사람들 중에는 최초의 버그라고 말하는 이도 있는 듯. ㅋ 최초의 ‘버그’는 패널 F의 70번 릴레이[8] 아닌가? ㅋ

.


[1] 이코노미스트 Python has brought computer programming to a vast new audience Jul 19th 2018
[2] 내 백과사전 [서평] 에이다, 당신이군요. 최초의 프로그래머 – 컴퓨터 탄생을 둘러싼 기이하고 놀라운 이야기 2018년 1월 15일
[3] 와이어드 UNTANGLING THE TALE OF ADA LOVELACE 12.22.1512:00 AM
[4] 엔가젯 Ada Lovelace manuscript and algorithm fetch $125,000 at auction 07.25.18
[5] Rare book by world’s first computer programmer sells for £95,000 (mailchi.mp)
[6] Running the first program (Enigmatic Code)
[7] What Did Ada Lovelace’s Program Actually Do? (hacker news)
[8] 내 백과사전 1947년 9월 9일, 최초의 버그가 발견되다 2013년 9월 10일

그래프 이론으로 외환시장에서 수익 내기?

해커 뉴스[1]에서 흥미로운 글[2]을 봤는데, 분량은 꽤 길지만 대단히 재미있으니 일독을 권한다. 이 블로거 뭐하는 사람인지 궁금하네. ㅋㅋ

원래 글[2]은 그래프 이론을 응용하여 문제를 해결하는 세 가지 이야기를 하고 있는데, 첫 번째 이야기가 외환시장에서 아비트리지 수익을 내는 법이고, 두 번째 이야기가 강화 학습에 관한 내용이고, 마지막이 컴퓨터 그래픽스에서 path tracingray tracing을 구현하는 법이다. 근데, 관련 지식이 없어서 첫 번째 이야기만 빼고 무슨 말인지 잘 모르겠음-_-

여하간 첫 번째 이야기 만으로도 충분히 재미있으니 볼만하다. ㅎㅎㅎ

전산 수학의 중요한 부분 중 하나인 그래프 이론은 개론 정도만 배운 적이 있는데, 어렸을 때, ramsey problem에서 R(4, 6)의 값을 구해보려고 나름 용을 쓰던게 생각나는 구만 ㅋㅋㅋㅋ 일전에 R(5, 5) 이야기[3]를 한 적이 있다.

weighted graph에서 최단거리를 찾는 방법 중에 Bellman–Ford algorithm이 있는 모양인데, 이 알고리즘은 Dijkstra’s algorithm보다 속도는 좀 느리지만, edge weight가 음수인 경우도 처리할 수 있는 장점이 있다. Dijkstra 꺼는 음수가 처리 안되는 듯 하다. 사실 pseudo-code를 봐도 Bellman–Ford 알고리즘이 잘 이해가 안 되던데-_- 어느 친절한 블로거의 설명[4]을 보니 이해가 된다. 이 자리를 빌어 감사함. ㅎㅎ

외환시장은 세계에서 가장 큰 시장이라고 하는데, 블로그의 글[2]에 따르면 일일 거래금액이 5 trillion USD나 된다고 한다. 거래 규모가 방대하므로 미미한 비율의 수익률도 매우 큰 돈이 될 수 있다.

각 통화 (USD, JPY, BTC 등등)을 그래프의 노드라고 보았을 때, 각 통화의 교환비율(즉 환율)의 로그값을 weight로 갖는 그래프를 생각해볼 수 있다. 즉, 두 통화 A, B에 대해 log B/A를 directed weight로 갖는다. 이 경우 그래프를 순환하여 weight의 합이 0이 넘거나 모자라는 path를 찾는 경우가 바로 arbitrage trade의 기회가 될 수 있는 것이다. 왜냐하면 weight의 합산은

\displaystyle \log \frac{B}{A} + \log \frac{C}{B} + \cdots + \log \frac{A}{Z} = \log \frac{A}{A}

이 되고, 이 값이 0이 되어야 완전히 효율적인 시장이 된다. 이 값이 0이 아니라면 그 경로를 따라 외환을 환전하면 (음수면 역방향) 최총적으로 본래의 통화로 돌아왔을 때, 돈이 벌리는 것이다. ㅋㅋㅋ 원래 알고리즘이 합산을 하는 거라 로그를 썼지만, 실제로 구현할 때는 그냥 곱셈으로 1과 비교하는 게 편리할 듯 하다.

근데 모든 노드에 대해 거의 실시간으로 Bellman–Ford algorithm으로 계산하여 루트를 찾아야 하는데, 얼마나 효과적일지는 모르겠다. 뭐, 매우 미미한 비율이라도 시장이 원체 크고 환전 이후에는 제자리로 돌아오기 때문에, 짧은 기간동안 레버리지를 크게 하면 버는 돈이 상당히 될 듯 하기도 하다. LTCM의 초창기 높은 수익도 미미한 아비트리지 수익률을 큰 레버리지로 올렸기 때문에 가능했으니. ㅋ

아니면 거래 속도를 더 중시한다면 외환시장대신 cryptocurrency 사이의 교환비율에 Bellman–Ford algorithm을 적용해도 가능할 듯 하다. 다양한 종류의 cryptocurrency를 취급하는 거래소 내에서 충분히 연산속도가 빠른 머신을 이용하면 아비트리지 수익이 나올 듯 하다. 다만 거래수수료가 문제일 듯. 이쪽은 한국인들이 워낙 호구[5]라서 시장이 불균형일 때가 더 많으니, 적용이 더 수월할 듯 하다. ㅎㅎ

.


[1] Dijkstra’s in Disguise (hacker news)
[2] Dijkstra’s in Disguise (blog.evjang.com)
[3] 내 백과사전 R(5,5)의 upper bound가 하나 줄어들다 2017년 3월 30일
[4] 벨만-포드 알고리즘 (ratsgo.github.io)
[5] 내 백과사전 비트코인 국내가격과 국제가격의 엄청난 차이 2017년 5월 27일

메이커스 매거진 부록 AI Maker Kit​

‘메이커스: 어른의 과학’ 이라는 잡지[1]의 부록으로 DIY 스마트 스피커가 딸려 있다고 해서 재미로 사 봤다. ㅋㅋ 라즈베리 파이까지 합친 버전이 있고 라즈베리 파이가 빠진 버전이 있다. 재생시간 4분 10초.

KT의 스마트 스피커인 ‘기가지니’의 백엔드 서버를 사용하는 것 같다. 조립한 이후에 작동을 위해서는 KT 개발자 홈페이지[2]에 등록을 해야하고, 개인사용자는 하루 500건의 쿼리가 무료로 제공된다. KT가 웬일로 이런 공익적 서비스를 제공하다니 ㅎㅎ 휴대폰 통신사를 KT로 쓰는 보람이 있구만. ㅋㅋㅋ

아무래도 구글의 DIY smart speaker kit[3,4]을 모방한 듯 한데, 어쨌든 사용자가 직접 커스터마이즈 할 수 있다는 매력이 있다. 게다가 한국어로 작동가능하다!!!!! 이게 진짜 엄청난 장점이다. ㅋㅋㅋ

‘메이커스’에 있는 그대로 따라하면 된다. 주의깊게 읽으면 컴맹도 일단은 조립해서 작동은 가능하도록 설명이 친절하게 돼 있다. 드라이버와 예제파일이 모두 포함된 라즈비안 이미지 파일은 KT의 기가지니 개발자 홈페이지[2]에서 받을 수 있다. 참고로 기가지니 개발자 포럼에서 pi3 B+에서는 작동을 안한다고 하는 사람이 있던데, 안전한 pi3 B를 사용하는 것이 좋을 듯 하다.

근데 문제는 라즈비안의 apt-get upgrade를 하는 순간에 내장 스피커가 먹통이 된다-_- 아무래도 버전문제 같은데, 여러모로 용을 써 봤지만 본인의 능력으로는 도저히 수정할 수가 없어서 apt upgrade를 못하고 있다. 드라이버만 별도로 제공[5]하긴 하는데, 이것도 역시 버전문제로 작동이 안 된다. 젠장.. 이것만 되면 메이커스에서 제공하는 킷 없이, 그냥 usb 마이크와 스피커를 연결해서 구현가능할 듯도 하다.

작동 코드는 node js를 쓰던데, 본인이 node js에 대한 지식이 전무해서 코드를 봐도 수정이 안 된다-_- 일단 stt로 입력받은 텍스트를 내가 우선 가공해서, KT 기가지니 DSS 서비스로 넣고 싶은데, 이 간단한 작업을 못 하겠다-_- 좌절이다-_-

KT에서 제공하는 stt의 성능은 그럭저럭인데 tts의 성능은 준수한 듯 하다. 예제파일을 몇 개 실행해 봤는데, 쓸데없이 재미있다. ㅋㅋㅋ

메이커스 킷에 들어있는 보드에는 gpio를 그대로 쓸 수 있도록 옆으로 빼 놓았는데, 여기에 예전에 라즈베리 파이 용으로 사둔 5인치 LCD 모니터[6]를 꼽아 쓸 수 았다. 이 모니터는 라즈베리 파이의 gpio에서 전류를 끌어 쓰기 때문에 별도의 전원 없이도 동작한다. 아주 짧은 hdmi선으로 연결하니 손바닥만한 훌륭한 컴퓨터가 되었다. ㅋㅋㅋㅋ 근데 이 모니터의 터치 기능을 쓰려면 apt upgrade를 해야해서[7] 못 쓰고 있다-_- 이걸 활용해서 한국어 사용이 가능한 아마존의 echo show처럼 멋있는 인공지능 스피커로 만들고 싶은데, node js를 몰라서 좌절 중이다ㅠㅠ

.


2018.8.12
JSON.stringify 라는 함수가 뭔지 이해했다!!!! 음하하하 뭔가 할 수 있을 것 같다. ㅋㅋㅋ

.


2018.8.13
node js가 너무 어렵다. 코드 실행 순서도 모르겠구만-_-

.


2018.8.20
지디넷 “중고생도 2시간이면 AI스피커 개발 가능” 2018.08.19.09:00

.


[1] http://makersmagazine.net/
[2] https://gigagenie.ai/
[3] https://aiyprojects.withgoogle.com/
[4] cnet Google includes a Raspberry Pi in a DIY smart speaker kit APRIL 16, 2018 2:36 PM PDT
[5] ai-makers-kit/driver/ (github.com)
[6] 라즈베리파이 5인치 800×480 HDMI LCD 터치스크린 모니터 [CN0024] (devicemart.co.kr)
[7] 5inch HDMI LCD (waveshare.com)

엽록체 안의 양자컴퓨터

생명, 경계에 서다 – 양자생물학의 시대가 온다
짐 알칼릴리, 존조 맥패든 (지은이), 김정은 (옮긴이) | 글항아리사이언스 | 2017-11-24 | 원제 Life On The Edge (2014년)

p167-173


지구상에서 두 번째로(DNA 다음으로) 중요한 분자라고 할 수 있는 엽록소는 더 자세히 들여다볼 가치가 있다(그림 4.5). 엽록소는 주로 탄소(회색 구)와 질소(N) 원자로 이루어진 오각형이 중심에 있는 마그네슘 원자(M)를 둘러싸고 있으며, 탄소, 산소(O), 수소(흰색) 원자로 이루어진 꼬리가 달려 있는 2차원 구조다. 마그네슘 원자에서는 최외각 전자가 원자의 나머지 부분과 느슨하게 연결되어 있다. 그래서 태양에너지의 광자를 흡수하면 전자가 마그네슘을 둘러싸고 있는 탄소로 빠져나올 수 있고, 마그네슘 원자에는 양전하를 띠는 구멍이 생긴다. 정공hole 또는 양공이라 불리는 이 구멍은 매우 추상적인 방식으로 생각될 수 있는데, 양전하로 하전된 구멍 자체를 하나의 ‘물체thing’로 보는 것이다. 이 개념에서는 마그네슘 원자의 나머지 부분은 중성으로 남겨두고, 광자의 흡수를 통해서 탈출한 전자와 그 자리에 남아 있는 양전하를 띠는 구멍으로 구성되는 계를 창조한다. 엑시톤(그림 4.6을 보라)이라 불리는 이 이중계는 음극과 양극으로 이루어진 작은 전지라고 생각할 수 있으며, 이 전지에는 나중에 사용할 에너지를 저장할 수 있다.

엑시톤은 불안정하다. 전자와 정공은 정전기적 인력을 느끼고 서로 끌어당긴다. 전자와 정공이 다시 결합하면, 원래 광자에 있던 태양에너지는 열로 손실된다. 따라서 식물이 포획한 태양에너지를 이용하고자 한다면, 엑시톤을 반응 중심이라고 알려진 분자 제조 시설로 잽싸게 옮겨야 한다. 반응 중심에서는 전하 분리라는 과정이 일어난다. 간단히 말해서, 고에너지 상태의 전자를 원자에서 완전히 분리해 이웃한 분자에 전달하는 과정인 전하 분리는 앞 장에서 관찰했던 효소의 작용과 무척 비슷하다. 이 과정을 통해서 엑시톤보다 더 안정된 (NADPH라고 불리는) 화학 전지가 만들어지고, 이 전지는 광합성의 모든 주요 화학반응을 일으키는 데 이용된다.

그러나 반응 중심은 분자 규모에서 볼 때 들뜬 엽록소 분자와 꽤 멀리(나노미터 거리) 떨어져 있다. 따라서 에너지가 반응 중심에 닿기 위해서는 엽록소의 숲에 있는 한 안테나 분자에서 다른 안테나 분자로 전달되어야만 한다. 이런 작용은 엽록소가 빽빽하게 들어차 있는 덕분에 일어날 수 있다. 광자를 흡수한 분자와 이웃한 분자는 맨 처음 들뜬 전자의 에너지를 효과적으로 이어받아 들뜬 상태가 될 수 있고, 이 에너지를 다시 자신의 마그네슘 원자의 전자에 전달한다.

문제는 어떤 경로를 통해서 에너지를 전달해야 하느냐에 관한 것이다. 만약 잘못된 방향으로 향하면, 엽록소의 숲을 아무렇게나 돌아다니다가 결국에는 반응 중심에 에너지를 전달하지 못하고 그냥 잃게 될 것이다. 어떤 방향을 향해야 할까? 엑시톤이 소멸되기 전에 길을 찾으려면 시간이 별로 없다.

최근까지도 한 엽록소 분자에서 다른 엽록소 분자로의 에너지 도약은 무계획적으로 일어나는 현상이라고 여겨졌다. 본질적으로, 무작위 걸음이라고 알려진 탐색 전략을 최후의 수단으로 적용했다는 것이다. 무작위 걸음은 때로 ‘주정뱅이 걸음drunken walk’이라고도 불리는데, 술에 취한 사람은 술집을 나와서 이리저리 헤매다가 결국에는 집을 찾아오기 때문이다. 그러나 무작위 걸음은 어딘가를 가는 수단으로는 별로 효과적이지 않다. 만약 집이 아주 멀다면, 그 취객은 마을 반대편에 있는 덤불숲에서 아침을 맞게 될지도 모른다. 무작위 걸음을 하는 대상이 시작점으로부터 이동하는 거리는 걸린 시간의 제곱근에 비례하는 경향이 있다. 술에 취한 사람이 1분 동안 1미터를 전진한다면, 4분 뒤에는 2미터, 9분 뒤에는 3미터를 나아간다는 것이다. 진행 속도가 이렇게 더디므로, 동물과 미생물이 먹이나 사냥감을 찾을 때 무작위 걸음을 하는 일은 당연히 드물다. 무작위 걸음은 다른 선택권이 없을 때 최후의 수단으로 사용하는 전략일 뿐이다. 개미 한 마리를 낯선 곳에 내려놓으면, 개미는 냄새를 맡자마자 무작위로 돌아다니지 않고 냄새를 따라갈 것이다.

후각도 없고 다른 길 찾기 능력도 없는 엑시톤 에너지는 주정뱅이의 전략을 따라 엽록체의 숲을 나아갈 것이라고 여겨졌다. 그러나 이런 추측은 잘 납득되지 않았는데, 광합성의 첫 단계인 이 과정은 대단히 효율적이라고 알려져 있었기 때문이다. 사실 엽록소의 안테나 분자에서 포획한 광자 에너지가 반응 중심으로 전달되는 과정은 알려진 모든 자연적 반응과 인위적 반응에서 가장 높은 효율성을 자랑한다. 효율성이 무려 100퍼센트에 근접한다. 최적의 조건 하에서는 엽록소 분자가 흡수한 에너지가 거의 다 반응 중심에 도달한다는 것이다. 만약 정처 없이 헤매는 경로를 따라 이동한다면, 거의 모든 에너지가 중간에 사라져야 마땅하다. 어떻게 광합성 에너지는 주정뱅이나 개미나 가장 효율적인 에너지 기술보다도 목적지를 훨씬 잘 찾아갈 수 있을까? 이 문제는 생물학에서 가장 난해한 수수께끼 중 하나였다.

양자 맥놀이

MIT 모임의 회원들이 웃어넘긴 기사의 도화선이 된 연구 논문3의 책임 저자는 귀화 미국인인 그레이엄 플레밍이었다. 1949년에 잉글랜드 북부의 배로에서 태어난 플레밍은 현재 캘리포니아 버클리 대학에서 한 연구팀을 이끌고 있다. 양자역학 분야에서 세계 최고의 연구팀 중 하나로 인정받고 있는 그의 팀은 “2차원 푸리에 변환 전자 분광학two-dimensional Fourier transform electronic spectroscopy”(2D—FTES)이라는 인상적인 이름의 막강한 기술을 활용한다. 2D-FTES는 가장 미세한 분자계에 지속 시간이 짧은 레이저 펄스를 집중시킴으로써 그 분자계의 내부 구조와 역학을 조사할 수 있다. 이들은 식물이 아니라 주로 페나-매슈스-올슨(FMO) 단백질이라는 광합성 복합체를 이용해서 연구를 했다. 이 단백질은 녹색황세균이라는 광합성 미생물에서 만들어지는데, 이 세균은 흑해와 같은 황화물이 풍부한 깊은 바다에서 발견된다. 연구자들은 광합성 복합체에 세 개의 레이저 펄스를 연속적으로 쏘는 방식으로 엽록소 시료를 조사했다. 레이저 펄스가 매우 빠르고 정확한 시간 동안 지속되는 에너지를 방출하면, 시료에서는 이 에너지를 감지한 감지기가 빛 신호를 만든다.

이 논문의 주저자인 그레그 엥겔은 밤을 꼬박 새워서 50〜600펨토초 길이의 신호가 만들어내는 자료들을 이어 붙이고 그 결과를 그래프로 만들었다. 그가 발견한 것은 최소 600펨토초 동안 진동하면서 오르내리는 신호였다(그림 4.7). 이 진동은 이중 슬릿 실험 에서 밝은 부분과 어두운 부분이 번갈아 나타나는 간섭무늬를 닮았다. 또는 악기를 조율할 때 들을 수 있는 소리의 맥놀이와도 비슷했다. 이런 ‘양자 맥놀이’는 엑시톤이 엽록소라는 미로에서 하나의 길을 따라서만 나아가는 것이 아니라 여러 개의 경로를 동시에 나아간다는 것을 보여준다(그림4.8). 이와 같은 여러 갈래의 길은 거의 조율된 기타에서 나는 진동음과 조금 비슷한 작용을 한다. 길이가 거의 같으면 맥놀이를 만드는 것이다.


그런데 이런 양자 결맞음은 대단히 섬세해서 유지시키기가 극히 어렵다는 점을 기억하자. 결어긋남을 막기 위해 영웅적인 노력을 기울이고 있는 유수의 MIT 양자컴퓨터 연구자들보다 미생물과 식물이 더 뛰어나다는 것이 가당키나 한 일인가? 플레밍의 논문에서 내놓은 주장은 참으로 대담했다. 세스 로이드의 말처럼, 이 “수상한 양자 속임수”는 이 MIT 학자 모임의 화를 돋웠다. 버클리 연구진은 FMO 복합체가 반응 중심에 이르는 가장 빠른 경로를 찾는 양자컴퓨터처럼 작용한다고 제안하고 있었다. 이런 최적화 문제는 다수의 목적지를 경유하는 여행 경로와 연관된 유명한 수학 문제인 외판원 순회 문제에 해당되며, 대단히 강력한 컴퓨터로만 해결이 가능하다.

 


3 G. S. Engel, T. R. Calhoun, E. L. Read, T-K. Ahn, T. Mančal, Y-C. Cheng, R. E. Blankenship and G. R. Fleming, ‘Evidence for wavelike energy transfer through quantum coherence in photosynthetic systems’, Nature, vol. 446 (2007), pp. 782-6 doi: https://doi.org/10.1038/nature05678

아니 이게 무슨 소리요?? 물리학자, 생물학자 양반들???? 혼란하다 혼란해-_-

점화식을 통한 수열의 계산에서 COBOL의 장점

해커뉴스[1]에서 COBOL의 장점에 대해 논하는 글[2]을 봤다.

프로그래밍계의 고대 언어라 할 수 있는 COBOL이 아직도 은행권에서 쓰이는 모양인데, 글쓴이의 주장[2]에 따르면, 미국 GDP의 7% 규모(!)에 해당하는 지불이 COBOL에 의존하고 있다고 한다. 근데 출처가 없어서 어디서 도출된 숫자인지는 잘 모르겠네-_-

여하간 여전히 COBOL이 퇴출되지 않는 이유로, 글[2]에서 든 사례가 점화식을 통한 수열을 계산하는 부분이다. 다음 점화식을 생각해보자.

x_0 = 4, x_1 = 4.25, \displaystyle x_i = 108-\frac{815-1500/x_{i-2}}{x_{i-1}}

십진법 소수점으로 이루어진 실수값을 컴퓨터로 연산할 경우, 이진법을 사용하기 때문에 우리가 일반적으로 쓰는 십진법과 정확히 값이 일치하지 않고, 자연적으로 오차를 포함하게 된다. 유명한 사례가 0.1+0.2인데, 심지어 각종 프로그래밍 언어별로 이 결과를 비교하는 사이트[3]도 있고, SMBC에서도 이를 이용한 개그[4]도 선보이고 있다. ㅋㅋㅋ

floating point 연산은 소수점의 위치에 따라 오차의 크기가 가변적이 되므로, 위 점화식을 C나 Java같은 일반적인 언어로 구현하면 재귀적으로 누적된 오차가 극적으로 커지는 상황이 올 수도 있다. 위 수열은 수학적으로 5에 수렴해야하는데, (일반항이 5-\frac{2}{1+(5/3)^n}이다.) 몇 항 지나지 않아 100으로 값이 튀게 된다. 방정식 x^3 - 108 x^2 + 815 x - 1500 = (x - 3)(x - 5)(x - 100) =0의 근이 attraction point이므로 100으로 빨려간다.

이 점화식은 Muller’s Recurrence라는 이름으로 부르는 것 같다. Jean-Michel Muller라는 사람이 1980년경에 만든 것이라고 하는데,[5;p14] 이 Muller’s Recurrence는 floating point 연산이 실패하는 극적인 사례로 나름 유명한 듯 하다.[6] ㅎㅎ

위키피디아의 Loss of significance 항목에서 이차방정식의 근의 공식을 이용한 floating point 연산의 오차가 커지는 사례가 나와 있는데, 일전에 본 블로그에서 설명한 내용[7]과 일치한다. ㅋㅋ

그러나 COBOL은 fixed point 연산을 사용하여, 오차의 크기가 항상 일정하기 때문에 그런 일이 일어나지 않는다고 한다. 이런 특성 때문에 COBOL이 더 강점이긴하지만, 일전의 floating point를 이용한 제곱근 역수 트릭[8]은 쓸 수 없을 듯. ㅎㅎ

근데 정말로 은행권에서 재귀적 수열계산이나 방정식의 근의 계산과 같은 작업이 필요하단 말인가??? 정말 이런 수학적 이유로 인해 은행이 COBOL에서 다른 언어로 갈아타는 것이 어렵단 말인가??? 해커뉴스[1]의 몇몇 사람들도 이 글[2]이 misleading이라는 이야기를 하던데, 실제 사례를 보기 전까지는 개인적으로 좀 믿기 힘든 주장 같다.

.


[1] Is Cobol holding you hostage with Math? (hacker news)
[2] Is COBOL holding you hostage with Math? (medium.com/@bellmar)
[3] http://0.30000000000000004.com/
[4] http://www.smbc-comics.com/?id=2999
[5] How Futile are Mindless Assessments of Roundoff in Floating-Point Computation? (376kb pdf) (people.eecs.berkeley.edu/~wkahan)
[6] Muller’s Recurrence – roundoff gone wrong (latkin.org)
[7] 내 백과사전 저전력을 위한 이차방정식의 근의 공식을 개선하기 2018년 4월 29일
[8] 내 백과사전 제곱근 역수와 마법의 수 0x5f3759df 2014년 10월 29일

유니코드에 출몰하는 유령 : 유령한자

해커뉴스[1]에서 흥미로운 이야기[2]를 들었다. ㅋㅋ

1978년 일본의 경제산업성에서 일본어 문자코드인 JIS X 0208을 제정할 당시, 일부 출처도 알 수 없고 실제로 거의 쓰이지도 않는 한자 수십 개가 포함되었는데, 이를 ‘유령문자‘라고 부르고 있는 듯 하다. 나무위키[3]에도 항목이 있다.

이 한자들은 주요문서에 나와 있지 않는 한자이므로, 의미가 불명하고 읽는 방법도 아는 사람이 없었다고 한다. 문제는 이 한자들이 그대로 유니코드에 등록되어 현재 유니코드 목록에도 남아있다는 점이다.

꽤 오랜 기간동안 이 한자들은 설명되지 않고 잊혀진 채로 남아있었는데, 1997년 대대적인 조사를 착수하여 상당수는 출처를 찾아내는 데 성공한 모양이다. 다만 최후로 남은 12개의 한자는 그 어느 문헌에서도 찾지 못한 한자라서 발음과 의미가 불명인 상황이라고 한다. 일본 위키피디아 유령문자 항목에 12개의 목록이 나열되어 있다.

재미있는 한자는 ‘妛’ 인데, 카탈로그를 제작한 사람과 인터뷰를 하여 조사한 결과, 본래 존재하는 한자인 𡚴자를 전산화하는 과정에서, 山자와 女자가 각각 인쇄된 종이로 잘라 붙여 복사할 때, 가로선이 삽입되어 탄생한 한자라고 한다. 덕분에 진짜 올바른 한자 ‘𡚴’자는 한참후에 유니코드에 등록될 수 있었다고 한다.

12한자 중 11자는 어떤 이유로 실수했는지 대략적인 추정이 되고 있으나, 최후의 마지막 한자인 ‘‘는 어떤 문헌에서도 나타나고 있지 않기 때문에, 의미도 발음도 불명확한 가장 미스테리한 한자가 돼 버렸다고 한다. 나무위키에 별도의 항목[4]이 있다. 일본어 위키피디아의 설명대로, 좁은 의미로는 유령한자는 이 한자 뿐이라고 말할 수도 있을 것이다.

.


[1] A Spectre is Haunting Unicode (hacker news)
[2] A Spectre is Haunting Unicode (dampfkraft.com)
[3] 유령 문자 (나무위키)
[4] (나무위키)

저전력을 위한 이차방정식의 근의 공식을 개선하기

John D. Cook 선생의 블로그는 한동안 안 보고 있었는데, 해커뉴스[1]에서 John D. Cook 선생의 흥미로운 블로그 글[2]이 화제가 되고 있어 포스팅함. ㅋ

중학생들에게 ‘암기’라는 심리적 장벽-_-을 가져오기에 충분한 이차방정식 ax^2 + bx+c=0의 근의 공식은 잘 알려진 대로 다음과 같다.

\displaystyle x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} …… (1)

근데 실제 프로그래밍에서 플로팅 포인트 오차 때문에 이 공식을 그대로 쓰면 b가 매우 큰 경우에는 오차가 꽤 커진다고 한다. John D. Cook 선생은 파이썬으로 예시를 보여주고 있지만, 본인은 한국 수학 교사들의 영원한 동반자-_-라 할 수 있는 아래 한/글에 내장된 한글 스크립트로 구현해 보았다. ㅋㅋ

function OnScriptMacro_test12()
{
	var temp = quadratic(1, Math.pow(10,8), 1);

	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
	HParameterSet.HInsertText.Text = "Answer : " + temp[0] + ", " + temp[1];
	HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);
}

function quadratic(a, b, c)
{
	var r = Math.sqrt(b*b - 4*a*c);
	return [(-b+r)/(2*a), (-b-r)/(2*a)];
}

function quadratic2(a, b, c)
{
	var r = Math.sqrt(b*b - 4*a*c);
	return [2*c/(-b-r), 2*c/(-b+r)];
}

실행해보면 Answer : -7.450580596923828e-9, -100000000 가 나오는데, 두 번째 근은 얼추 정확하지만, 첫 번째 근은 실제 근에 비해 무려 25%나 오차가 발생한다. b의 값이 매우 크기 때문에 \sqrt{b^2 -4ac}는 거의 b와 가깝게 되고, 이 두 값을 빼는 순간, 상대적으로 작은 차이의 값이 매우 크게 부각된다.

이 부분을 방지하기 위해, 원래 근의 공식의 분모와 분자에 -b \mp \sqrt{b^2 -4ac}를 곱하여, 분자를 유리화한 다음과 같은 근의 공식을 생각한다.

\displaystyle x = \frac{2c}{-b \mp \sqrt{b^2 -4ac}} …… (2)

위 한글 스크립트 코드의 3번 라인에 함수를 두 번째 걸로 바꾸면 된다. 실행해보면 Answer : -1e-8, -134217728 가 나오는데, 이번에는 첫 번째 근이 얼추 맞지만 두 번째 근이 같은 이유로 34%나 오차가 발생한다. 따라서 결론은 두 방법들 중 정확한 것들만 취하면 된다!!

왜 이런 방법이 필요한가에 대해 John D. Cook 선생은 저전력의 장점에 대해 설명하고 있다. floating point 계산에 드는 전력은 64피코줄, 레지스터에 데이터를 저장하는데 드는 전력은 6피코줄 정도의 에너지를 소모하지만, DRAM의 데이터를 읽는데 드는 전력은 무려 4200피코줄의 에너지를 소모한다고 한다. 따라서 식 (1)만으로 이차방정식을 풀려면 더 많은 전력소모를 하게 된다. 즉, 모바일이나 IoT에서 더 적은 전력소모로 프로그램을 구현하기 위한 방법이라 할 수 있다. (댓글을 참조 바람)

근데 본인은 프로그래머가 아니라서, 프로그래밍을 할 때 정말로 이차방정식을 풀 필요가 있나?? 싶은 의문이 좀 들던데, 해커뉴스[1] 사람들의 이야기를 보니 몇몇 경우에 따라서는 floating point error를 심각하게 생각하는 경우가 있는 모양이다. 이거이거 중학교 수학 샘들은 식 (2)와 같은 근의 공식도 암기하도록 교육하시길 바란다. ㅋㅋㅋㅋㅋㅋㅋㅋ

이걸 보니 일전에 제곱근 역수를 계산하는 트릭[3]이 생각나는데, 수학에 기반하여 연산속도를 높이거나 전력소모를 줄이는 프로그래밍 트릭이 앞으로도 쓸모가 없지는 않을 듯 하다. ㅎㅎㅎ

 


[1] The quadratic formula and low-precision arithmetic (hacker news)
[2] The quadratic formula and low-precision arithmetic (John D. Cook)
[3] 내 백과사전 제곱근 역수와 마법의 수 0x5f3759df 2014년 10월 29일