응용수학에 관심이 있거나, 컴퓨터 관련 수업을 들었다면 round off error를 들어봤을 것이다
컴퓨터는 2진법으로 수를 표현하고 정확도에 한계가 있기 때문에, 실수의 연산들마다 error가 생겨서 좆될 수 있단 얘기다(http://gall.dcinside.com/mathematics/221289 에 관련 사건도 있다)
물론 대다수의 계산에서 오차는 매우 작고, 사실 대다수는 신경쓰지도 않는다. (심지어 딥러닝의 경우는 지금 쓰는 16bit 정확도도 불필요하게 정확하단 얘기가 있어서 8bit 포맷을 지원하는 경우도 있는 거로 안다.)
나도 영원히 신경쓸 일이 없을 줄 알았다.

때는 겨울
그때 인생이 없었던 수갤러라면 언젠가 이런 퀴즈를 본 적이 있을 것이다(누구인지는 찾아보던가 본인이 등판하던가 하겠지 일단은 안밝힌다)

1 5 6 7과 사칙연산 괄호로 21을 만들기

좀 생각하다가 귀찮아진 나는 matlab으로 경우의 수를 다 찾는다는 아주 빙신같은 방법을 쓰기로 했고,
불가능하다는 결론을 얻었다가 지적받고 나누기와 관련해서 실수를 한걸 찾아서 결국은 답을 얻긴 했다.
근데 이 문제를 낸 수갤러는 컴퓨터를 활용하면 해결될거라 생각하는 연구를 하고 있었고, 그 문제를 계기로 내가 그 부분을 프로그램하게 되었다
잘 풀리면 어디 논문에 별거 한것도 없으면서 이름올라가는거 아냐?란 개꿀 마인드로 파이썬 프로그래밍을 시작했다

그 문제를 대충 요약하면 정수 성분을 갖는 정사각행렬들 중에서 어떤 성질을 만족하는 애들중에서,
det의 부호(혹은 -2와의 크기 비교)와 관련된 다른 성질을 만족하는 놈들이 몇개이고 어떤 놈들이 있는지를 찾는게 목표였다.
퍼포먼스를 무시하면 당연히 어렵지 않은 문제였고, numpy 좀 쓰면서 코딩을 좀 하니까 대충 돌아가는 것 같아서 수가 많아지는 부분에 돌려봤는데...

viewimage.php?id=20bcc42ee0df39b267bcc5&no=24b0d769e1d32ca73cef85fa11d02831dc7f5dc338ba31e98e3bde94c405fda8659002593a1e2607bb1e8d46460dd77533329adc79d5fd06273631130d1ced2654475bc70a1c532f2ca5c359d3db9f66e102202de31a

원래 3개가 나와야 하는 부분에서 16개나 쳐 나온 것이다 시발
그래서 왜그런가 더 나온 부분에서 돌려봤는데

viewimage.php?id=20bcc42ee0df39b267bcc5&no=24b0d769e1d32ca73cef85fa11d02831dc7f5dc338ba31e98e3bde94c405fda8659002593a1e2607bb1e8d46460dd77533329adc79d5fd0627366c4f0d16bb241dfdcb33d91e52a2474a46743fd530949ad112c2d8da

viewimage.php?id=20bcc42ee0df39b267bcc5&no=24b0d769e1d32ca73cef85fa11d02831dc7f5dc338ba31e98e3bde94c405fda8659002593a1e2607bb1e8d46460dd77533329adc79d5fd0627363913594aeb75a1407a7cc1715805613522dd8d8b8ae1c490d095bf219a4b55b6dad2

우와 정말 데단해~
그렇다 det를 구하는 건 그냥 정의대로하면 존나게 오래걸리는 작업이기 때문에,
이걸 라이브러리에 구축할때는 다른 방법을 쓰게된다
가장 많이 쓰이는건 LU 분해를 한 후 대각성분을 곱해서 얻는거고, 사실 가장 빠른축에 속한다(FFT를 쓰면 complexity는 더 낮은데 실제로 빨라지는건 한참뒤라서)

그리고 알다시피 LU는 실수의 나누기를 쓰고, 따라서 round off error가 발생해서 정수성분의 행렬의 det를 구하는데 저런 빙신같은 일이 생기는 것이다

viewimage.php?id=20bcc42ee0df39b267bcc5&no=24b0d769e1d32ca73cef85fa11d02831dc7f5dc338ba31e98e3bde94c405fda8659002593a1e2607bb1e8d46460dd77533329adc79d5fd062736394f5d1fe927fa7c2a4bf18cf84f053eb495495140afd32819ee31a8f3035b58ebba

혹은 이런일말이지 씨발
쨋든 내장된 det는 죄다 이모양이었고, 연구를 계속하려면 아예 실수의 나누기를 배제한 det를 만들어야했다... 시발
쨋든 살면서 영원히 round off error를 신경쓸 일이 없을 걸로 생각한 나와 그 수갤러는 존나 큰 충격을 받고 교훈을 얻었다고 한다


p.s 그래서 연구는 계속 되었는가? 안타깝게도 문제는 다른데에 있었는데, 갈수록 계산해야하는 행렬의 갯수가 조오오오ㅗㅇ로오오ㅗㄴ나게 많아져서 저 파이썬으로 짠 코드를 그대로 넣으면 7억년이 걸린다는 계산이 나오더라
어떻게 줄이고 줄여도 워낙 큰 수라서 gpgpu로 병렬처리를 하지 않는이상 답이 없고 하더라도 답이 안나올 것 같은디.. 문제는 cuda C를 하는데도 한세월이고 그사이에 개학하고 의지가 바닥나버렸다...흑흑

p.s2 그래도 실수의 나누기를 배제한 det는 찾아보고 만들어 보긴 했다. 궁금한 사람은 Bareiss Algorithm을 찾아봐라.