코딩 연습

프로젝트 오일러 144번 본문

project euler with python

프로젝트 오일러 144번

코딩아저씨 2016. 3. 15. 16:10
반응형

In laser physics, a "white cell" is a mirror system that acts as a delay line for the laser beam. The beam enters the cell, bounces around on the mirrors, and eventually works its way back out.

The specific white cell we will be considering is an ellipse with the equation \(4^x+y^2=100\).

The section corresponding to \(-0.01 \le x \le 0.01\) at the top is missing, allowing the light to enter and exit through the hole.

 



 


The light beam in this problem starts at the point \((0.0, \;10.1)\) just outside the white cell, and the beam first impacts the mirror at \((1.4, \; -9.6)\).

Each time the laser beam hits the surface of the ellipse, it follows the usual law of reflection "angle of incidence equals angle of reflection." That is, both the incident and reflected beams make the same angle with the normal line at the point of incidence.

In the figure on the left, the red line shows the first two points of contact between the laser beam and the wall of the white cell; the blue line shows the line tangent to the ellipse at the point of incidence of the first bounce.

The slope \(m\) of the tangent line at any point \((x, \;y)\) of the geven ellipse is: \(m=-\dfrac{4x}{y}\).

The normal line is perpendicular to this tangent line at the point of incidence.

The animation on the right shows the first \(10\) reflections of the beam.

How man times does the beam hit the internal surface of the white cell before exiting?



레이저 물리학에서 "화이트 셀" 이란 레이저 빔이 지나간 자리(지연선)를 보여주는 일종의 반사경 시스템을 말한다. 빔이 셀에 들어가게 되면 셀을 빠져 나올때까지 계속적으로 반사경에 반사되면서 진행하게 된다. 

우리가 이 문제에서 다루게 될 화이트 셀은 \(4x^2+y^2=100\) 으로 표현되는 타원이다. 이 타원의 \(-0.01 \le x \le 0.01\) 에 해당하는 윗쪽 부분에 구멍이 생겨서, 이 구멍을 통해 레이저 빔이 들어가고 나올 수 있다고 한다.

이 문제에서 레이저 빔은 타원의 바깥쪽 \((0.0, \; 10.1)\) 의 위치에서 출발하여 타원(셀) 안으로 들어와 처음으로 \((1.4, \;-9.6)\) 위치에서 반사된다. 레이저 빔이 타원에 부딪혀 반사될 때는 입사각과 반사각이 동일하게 되는 방향으로 반사된다. 즉, 반사되는 점에서의 법선과 입사 빔이 이루는 각이, 법선과 반사 빔이 이루는 각과 같아야 한다. 

위의 왼쪽 그림은 빨간색 라인이 레이저 빔을 나타내고 있으며 레이저 빔이 타원 안으로 들어와 처음 두 번 반사되는 점까지를 보여주고 있다. 파란색 라인은 첫 번째 반사점에서 타원에 접하는 접선을 나타내고 있으며, 이 접점을 지나고 접선에 수직인 직선이 법선이 된다.

타원 위의 점 \((x, \;y)\) 에서 타원에 접하는 접선의 기울기는 \(-\dfrac{4x}{y}\) 라는 것은 미적분학을 통하여 알 수 있다.

위 오른쪽 움직이는 그림은 레이저 빔이 타원 안으로 들어와 \(10\) 번 반사될 때 까지의 레이저 빔의 이동을 나타내고 있다. 

그렇다면 이 레이저 빔이 윗쪽 구멍을 통해 다시 빠져 나갈때까지 반사되는 횟수는 몇 번일까?


1. 반사빔의 기울기 알아내기

반사빔의 기울기를 알기 위해서는 두 가지를 알고 있어야 한다. 첫 번째는 입사빔의 기울기이고, 두 번째는 반사점에서의 법선의 기울기이다. 입사빔의 기울기는 이전 반사점과 현 반사점의 좌표를 알면 구할 수 있다. 예를 들어, 첫 번째 입사빔의 기울기는 점 \((0.0, \; 10.1)\) 과 점 \((1.4, \; -9.6)\) 을 지나는 직선의 기울기가 된다. (물론 이때는 \((0.0, \; 10.1)\) 이 이전 반사점이 아닌 출발점을 나타낸다.) 따라서 입사빔의 기울기는 \(\dfrac{0.0-1.4}{10.1-(-9.6)} = -\dfrac{1.4}{19.7}\) 이 된다. 

또한 반사점에서 타원에 접하는 접선의 기울기가 \(=\dfrac{4x}{y}\) 라고 알려 줬으므로 그 점에서 법선의 기울기는 \(\dfrac{y}{4x}\) 가 된다. 

이제 우리는 아크탄젠트를 이용하여 두 직선이 \(x\) 축의 양의 방향과 이루는 각을 라디안으로 나타낸 후, 두 각의 차를 구한다. 이 두 각의 차를 법선이 \(x\) 축의 방향과 이루는 각에 더하거나 빼서 반사빔의 \(x\) 축과 이루는 각의 크기를 알아내고, 다시 탄젠트 함수를 이용하여 반사빔의 기울기를 알아내는 것이다. 

예를 들어, 입사 빔의 기울기가 \(s\), 법선의 기울기가 \(ns\) 라고 하면 입사 빔이 \(x\) 축의 양의 방향과 이루는 각 \(\alpha\) 는 \(\arctan(s)\), 법선이 \(x\) 축의 양의 방향과 이루는 각 \(\beta\) 는 \(\arctan(ns)\) 라고 표현할 수 있다. 이때 두 각의 차는 \(|\alpha - \beta|\) 가 되고, \(\beta \pm |\alpha-\beta|\) 중 \(\alpha\) 와 값이 다른 쪽이 반사 빔이 \(x\) 축의 양의 방향과 이루는 각이 된다. (물론 오차가 생기기 때문에 \(\alpha\) 와 같은지를 비교하는 것이 아니라 어느 쪽이 \(\alpha\) 와의 차가 더 큰지를 이용하여 반사 빔의 각을 찾아낸다.) 이후에 다시 탄젠트 함수를 이용하여 기울기를 찾는다.


2. 반사빔이 다시 타원과 만나게 되는 반사점 알아내기

반사빔의 기울기가 \(m\) 으로 구해졌고, 이전 반사점의 좌표가 \((x_1, \; y_1)\) 이라면 반사빔의 방정식은 \(y=m(x-x_1)+y_1\) 이 될 것이다. 이를 타원의 방정식에 대입하며 정리하면 \[\left (m^2+4 \right ) x^2 -2 \left (m^2 x_1 - my_1 \right ) x + m^2x_1^2+y_1^2-2mx_1y_1-100=0\]이 된다. 근의 공식을 이용하여 \(x\) 값들을 구해내면 \[x=\dfrac{ \left ( m^2x_1 - my_1 \right ) \pm \sqrt{\left ( m^2x_1 - my_1 \right ) ^2 - \left ( m^2 +4 \right ) \left ( m^2 x_1^2 + y_1^2 - 2mx_1y_1-100 \right)}}{m^2 +4}\] 가 된다. 이 두 개의 \(x\) 값중 \(x_1\) 과 다른 것이 우리가 찾는 새로운 반사점의 \(x\) 좌표가 된다. (여기서도 물론 계산의 오차가 발생하므로 \(x_1\) 과의 차가 더 큰 쪽이 우리가 찾는 새로운 반사점의 \(x\) 좌표가 되는 것이다.) 무지하게 복잡하게 보이지만 

     \(a=m^2 +4\)

     \(b=m^2x_1-my_1\)

     \(c=m^2x_1^2 + y_1^2 - 2mx_1y_1 -100\)

으로 두고 계산하면 훨씬 깔금해진다.


위의 1, 2 과정을 반복하면서 반사점을 구해가다가 그 반사점의 \(x\) 좌표가 구간 \([-0.01, \;0.01]\) 에 속하고, \(y\) 좌표가 구간 \((9.9999, \; 10]\)에 속하면 빔이 타원을 빠져나오는 것으로 보고 반복을 멈추면 된다. (\(x=0.01\) 일 때의 타원의 방정식을 만족하는 \(y\) 값이 약 \(9.9999\)이다.)


문제도 길고, 그림도 복잡하여 첫인상은 상당히 어렵게 보이는 문제이지만 이전 문제에 비해서는 수월하게 풀리는 것을 알 수 있다.

반응형

'project euler with python' 카테고리의 다른 글

프로젝트 오일러 146번  (0) 2016.03.15
프로젝트 오일러 145번  (0) 2016.03.15
프로젝트 오일러 143번  (0) 2016.03.15
프로젝트 오일러 142번  (0) 2016.03.15
프로젝트 오일러 141번  (0) 2016.03.15


Comments