Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.48 KB | None | 0 0
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "다음 조건을 만족시키는 두 자연수 $a$, $b$의 모든 순서쌍 $(a, b)$의 개수를 구하여라.\n",
  8. "\n",
  9. "- $1 \\le a \\le 10$, $1 \\le b \\le 100$\n",
  10. "- 곡선 $y=2^x$이 원 $(x-a)^2 + (y-b)^2 = 1$과 만나지 않는다\n",
  11. "- 곡선 $y=2^x$이 원 $(x-a)^2 + (y-b)^2 = 4$와 적어도 한 점에서 만난다"
  12. ]
  13. },
  14. {
  15. "cell_type": "markdown",
  16. "metadata": {},
  17. "source": [
  18. "## Solution\n",
  19. "\n",
  20. "먼저 임의의 점 $(p, q)$와 $y=2^x$와의 거리를 측정해보도록 하자. 이는 $y=2^x$라는 constraint가 존재할 때 $(x-p)^2 + (y-q)^2$를 최소화시키는 문제와 같다.\n",
  21. "\n",
  22. "따라서 라그랑지안 $\\mathcal{L}$은 다음과 같이 정의된다\n",
  23. "\n",
  24. "$$\n",
  25. "\\mathcal{L}(x, y, \\lambda) = (x-p)^2 + (y-q)^2 + \\lambda(xlog2 - logy)\n",
  26. "$$\n",
  27. "\n",
  28. "$\\nabla\\mathcal{L} = 0$이어야 하므로 다음 식이 성립한다\n",
  29. "\n",
  30. "$$\n",
  31. "\\begin{align}\n",
  32. "\\nabla_{x}\\mathcal{L} &= 2x - 2p + \\lambda log2 = 0 \\\\\n",
  33. "\\nabla_{y}\\mathcal{L} &= 2y - 2q - \\frac{\\lambda}{y} = 0 \\\\\n",
  34. "\\nabla_{\\lambda}\\mathcal{L} &= xlog2 - logy = 0\n",
  35. "\\end{align}\n",
  36. "$$\n",
  37. "\n",
  38. "1, 2번식을 정리하면 $x$와 $y$를 $\\lambda$에 대해서 표현할 수 있다.\n",
  39. "\n",
  40. "$$\n",
  41. "\\begin{align}\n",
  42. "x &= p - \\frac{\\lambda log2}{2} \\\\\n",
  43. "y &= \\frac{q + \\sqrt{q^2 + 2\\lambda}}{2}(\\because y \\gt 0)\n",
  44. "\\end{align}\n",
  45. "$$\n",
  46. "\n",
  47. "이 식을 3번에 대입하면 $\\lambda$에 대한 식으로 바뀌고, 이는 newton raphson method로 해를 구할 수 있다. 이렇게 구한 좌표 $(x, y)$와 $(p, q)$간의 거리가 $y=2^x$와 $(p, q)$ 사이의 거리가 된다."
  48. ]
  49. },
  50. {
  51. "cell_type": "code",
  52. "execution_count": 13,
  53. "metadata": {},
  54. "outputs": [],
  55. "source": [
  56. "import math\n",
  57. "from scipy import optimize\n",
  58. "from functools import partial\n",
  59. "log2 = math.log(2)\n",
  60. "\n",
  61. "def x(p, l):\n",
  62. " return p - l*log2/2\n",
  63. " \n",
  64. "def y(q, l):\n",
  65. " return (q + math.sqrt(q**2 + 2*l))/2\n",
  66. "\n",
  67. "def f(p, q, l):\n",
  68. " return x(p, l)*log2 - math.log(y(q, l))\n",
  69. "\n",
  70. "def dist(p, q):\n",
  71. " \"\"\"Get Euclidean distance between y=2^x and (p, q)\"\"\"\n",
  72. " l = optimize.newton(lambda l: f(p, q, l), 1.0)\n",
  73. " x_ = x(p, l)\n",
  74. " y_ = 2**x_\n",
  75. " return math.sqrt((x_-p)**2 + (y_-q)**2)\n"
  76. ]
  77. },
  78. {
  79. "cell_type": "code",
  80. "execution_count": 14,
  81. "metadata": {},
  82. "outputs": [
  83. {
  84. "name": "stdout",
  85. "output_type": "stream",
  86. "text": [
  87. "2.7012892057857038e-15\n"
  88. ]
  89. }
  90. ],
  91. "source": [
  92. "# test\n",
  93. "print(dist(3, 8))"
  94. ]
  95. },
  96. {
  97. "cell_type": "code",
  98. "execution_count": 16,
  99. "metadata": {},
  100. "outputs": [
  101. {
  102. "name": "stdout",
  103. "output_type": "stream",
  104. "text": [
  105. "(1, 5)\n",
  106. "(1, 6)\n",
  107. "(1, 7)\n",
  108. "(1, 8)\n",
  109. "(2, 1)\n",
  110. "(2, 9)\n",
  111. "(2, 10)\n",
  112. "(2, 11)\n",
  113. "(2, 12)\n",
  114. "(2, 13)\n",
  115. "(2, 14)\n",
  116. "(2, 15)\n",
  117. "(2, 16)\n",
  118. "(3, 2)\n",
  119. "(3, 3)\n",
  120. "(3, 17)\n",
  121. "(3, 18)\n",
  122. "(3, 19)\n",
  123. "(3, 20)\n",
  124. "(3, 21)\n",
  125. "(3, 22)\n",
  126. "(3, 23)\n",
  127. "(3, 24)\n",
  128. "(3, 25)\n",
  129. "(3, 26)\n",
  130. "(3, 27)\n",
  131. "(3, 28)\n",
  132. "(3, 29)\n",
  133. "(3, 30)\n",
  134. "(3, 31)\n",
  135. "(3, 32)\n",
  136. "(4, 4)\n",
  137. "(4, 5)\n",
  138. "(4, 6)\n",
  139. "(4, 7)\n",
  140. "(4, 33)\n",
  141. "(4, 34)\n",
  142. "(4, 35)\n",
  143. "(4, 36)\n",
  144. "(4, 37)\n",
  145. "(4, 38)\n",
  146. "(4, 39)\n",
  147. "(4, 40)\n",
  148. "(4, 41)\n",
  149. "(4, 42)\n",
  150. "(4, 43)\n",
  151. "(4, 44)\n",
  152. "(4, 45)\n",
  153. "(4, 46)\n",
  154. "(4, 47)\n",
  155. "(4, 48)\n",
  156. "(4, 49)\n",
  157. "(4, 50)\n",
  158. "(4, 51)\n",
  159. "(4, 52)\n",
  160. "(4, 53)\n",
  161. "(4, 54)\n",
  162. "(4, 55)\n",
  163. "(4, 56)\n",
  164. "(4, 57)\n",
  165. "(4, 58)\n",
  166. "(4, 59)\n",
  167. "(4, 60)\n",
  168. "(4, 61)\n",
  169. "(4, 62)\n",
  170. "(4, 63)\n",
  171. "(4, 64)\n",
  172. "(5, 8)\n",
  173. "(5, 9)\n",
  174. "(5, 10)\n",
  175. "(5, 11)\n",
  176. "(5, 12)\n",
  177. "(5, 13)\n",
  178. "(5, 14)\n",
  179. "(5, 15)\n",
  180. "(5, 65)\n",
  181. "(5, 66)\n",
  182. "(5, 67)\n",
  183. "(5, 68)\n",
  184. "(5, 69)\n",
  185. "(5, 70)\n",
  186. "(5, 71)\n",
  187. "(5, 72)\n",
  188. "(5, 73)\n",
  189. "(5, 74)\n",
  190. "(5, 75)\n",
  191. "(5, 76)\n",
  192. "(5, 77)\n",
  193. "(5, 78)\n",
  194. "(5, 79)\n",
  195. "(5, 80)\n",
  196. "(5, 81)\n",
  197. "(5, 82)\n",
  198. "(5, 83)\n",
  199. "(5, 84)\n",
  200. "(5, 85)\n",
  201. "(5, 86)\n",
  202. "(5, 87)\n",
  203. "(5, 88)\n",
  204. "(5, 89)\n",
  205. "(5, 90)\n",
  206. "(5, 91)\n",
  207. "(5, 92)\n",
  208. "(5, 93)\n",
  209. "(5, 94)\n",
  210. "(5, 95)\n",
  211. "(5, 96)\n",
  212. "(5, 97)\n",
  213. "(5, 98)\n",
  214. "(5, 99)\n",
  215. "(5, 100)\n",
  216. "(6, 16)\n",
  217. "(6, 17)\n",
  218. "(6, 18)\n",
  219. "(6, 19)\n",
  220. "(6, 20)\n",
  221. "(6, 21)\n",
  222. "(6, 22)\n",
  223. "(6, 23)\n",
  224. "(6, 24)\n",
  225. "(6, 25)\n",
  226. "(6, 26)\n",
  227. "(6, 27)\n",
  228. "(6, 28)\n",
  229. "(6, 29)\n",
  230. "(6, 30)\n",
  231. "(6, 31)\n",
  232. "(7, 32)\n",
  233. "(7, 33)\n",
  234. "(7, 34)\n",
  235. "(7, 35)\n",
  236. "(7, 36)\n",
  237. "(7, 37)\n",
  238. "(7, 38)\n",
  239. "(7, 39)\n",
  240. "(7, 40)\n",
  241. "(7, 41)\n",
  242. "(7, 42)\n",
  243. "(7, 43)\n",
  244. "(7, 44)\n",
  245. "(7, 45)\n",
  246. "(7, 46)\n",
  247. "(7, 47)\n",
  248. "(7, 48)\n",
  249. "(7, 49)\n",
  250. "(7, 50)\n",
  251. "(7, 51)\n",
  252. "(7, 52)\n",
  253. "(7, 53)\n",
  254. "(7, 54)\n",
  255. "(7, 55)\n",
  256. "(7, 56)\n",
  257. "(7, 57)\n",
  258. "(7, 58)\n",
  259. "(7, 59)\n",
  260. "(7, 60)\n",
  261. "(7, 61)\n",
  262. "(7, 62)\n",
  263. "(7, 63)\n",
  264. "(8, 64)\n",
  265. "(8, 65)\n",
  266. "(8, 66)\n",
  267. "(8, 67)\n",
  268. "(8, 68)\n",
  269. "(8, 69)\n",
  270. "(8, 70)\n",
  271. "(8, 71)\n",
  272. "(8, 72)\n",
  273. "(8, 73)\n",
  274. "(8, 74)\n",
  275. "(8, 75)\n",
  276. "(8, 76)\n",
  277. "(8, 77)\n",
  278. "(8, 78)\n",
  279. "(8, 79)\n",
  280. "(8, 80)\n",
  281. "(8, 81)\n",
  282. "(8, 82)\n",
  283. "(8, 83)\n",
  284. "(8, 84)\n",
  285. "(8, 85)\n",
  286. "(8, 86)\n",
  287. "(8, 87)\n",
  288. "(8, 88)\n",
  289. "(8, 89)\n",
  290. "(8, 90)\n",
  291. "(8, 91)\n",
  292. "(8, 92)\n",
  293. "(8, 93)\n",
  294. "(8, 94)\n",
  295. "(8, 95)\n",
  296. "(8, 96)\n",
  297. "(8, 97)\n",
  298. "(8, 98)\n",
  299. "(8, 99)\n",
  300. "(8, 100)\n",
  301. "196\n"
  302. ]
  303. }
  304. ],
  305. "source": [
  306. "cnt = 0\n",
  307. "for a in range(1, 11):\n",
  308. " for b in range(1, 101):\n",
  309. " if 1 < dist(a, b) <= 2:\n",
  310. " print((a, b))\n",
  311. " cnt += 1\n",
  312. " \n",
  313. "print(cnt)"
  314. ]
  315. },
  316. {
  317. "cell_type": "code",
  318. "execution_count": null,
  319. "metadata": {
  320. "collapsed": true
  321. },
  322. "outputs": [],
  323. "source": []
  324. }
  325. ],
  326. "metadata": {
  327. "kernelspec": {
  328. "display_name": "Python 3",
  329. "language": "python",
  330. "name": "python3"
  331. },
  332. "language_info": {
  333. "codemirror_mode": {
  334. "name": "ipython",
  335. "version": 3
  336. },
  337. "file_extension": ".py",
  338. "mimetype": "text/x-python",
  339. "name": "python",
  340. "nbconvert_exporter": "python",
  341. "pygments_lexer": "ipython3",
  342. "version": "3.6.1"
  343. }
  344. },
  345. "nbformat": 4,
  346. "nbformat_minor": 2
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement