pellEqu Æç ¹æÁ¤½Ä x2 - M y2 = c ÀÇ ÃÖ¼ÒÇظ¦ ¾ò´Â´Ù. ´Ù¸¸, M ´Â Æò¹æ¼ö°¡ ¾Æ´Ñ Á¤Á¤¼ö, c = 1, -1.
int pellEqu(long *x1, long *y1, long *x2, long *y2, int m);
x1, y1 (Ãâ·Â) Æç ¹æÁ¤½Ä x2 - M y 2 = 1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ x2, y2 (Ãâ·Â) Æç ¹æÁ¤½Ä x2 - M y 2 = -1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ m (ÀÔ·Â) Æç ¹æÁ¤½ÄÀÇ °è¼ö M (1,4,9,16...ÀÌ¿ÜÀÇ ºñÆò¹æ¼ö)
c = 1 ¶Ç´Â -1 ÀÇ ¾çÂÊ ¸ðµÎ¿¡ ´ëÇÑ ÃÖ¼ÒÇظ¦ ¾òÀ» ¼ö ÀÖ¾úÀ» ¶§´Â 1, c = -1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ°¡ Á¸ÀçÇÏÁö ¾Ê¾ÒÀ» ¶§´Â 0. c = 1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇصµ c = 1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇصµ ¾òÀ» ¼ö ¾ø¾úÀ» ¶§´Â -1.
int pellEqu(long *x1, long *y1, long *x2, long *y2, int m) { long p0, q0, p1, q1, p, q; int a0, a; int s, t, k; if (m <= 1) return -1; *x1 = *y1 = *x2 = *y2 = 0; p0 = 1, q0 = 0; /* get m^(1/2) */ a0 = m, k = 1; while (k < a0) k <<= 1, a0 >>= 1; do a0 = k, k = (m / k + k) >> 1; while (k < a0); if (a0 * a0 == m) return -1; s = 0, t = 1, k = 0; p = a = a0, q = 1; for ( ; ; ) { s = a * t - s; t = (m - s*s) /t; if (t == 1) break; k++; a = (a0 + s) / t; p1 = p, q1 = q; p = a * p + p0; q = a * q + q0; if (p < 0 || q < 0) return -1; p0 = p1, q0 = q1; } if (k & 1) { *x1 = p, *y1 = q; return 0; } else { *x1 = p * p + m * q * q, *y1 = 2 * p * q; *x2 = p, *y2 = q; return 1; } }
Æç ¹æÁ¤½ÄÀÇ À̸§Àº ³ª-°¡ À߸øÇØ ¸í¸íÇÑ °ÍÀ¸·Î µÇ¾î ÀÖ´Ù. ÆçÀº ½ÇÀçÀÇ ¼öÇÐÀÚÀÌÁö¸¸, ÀÌ ¹æÁ¤½Ä¿¡ ´ëÇÑ ¿¬±¸´Â ÀüÇô ¾ø¾ú´Ù.
Æç ¹æÁ¤½Ä
¡¡¡¡¡¡¡¡x2 - M y2 = c ¡¡(M ´Â Æò¹æ¼ö°¡ ¾Æ´Ñ Á¤Á¤¼ö, c = +1, -1)
¿¡ µÎ¾î, ÀÚ¸íÇÑ ÇØ x = 1, y = 0 ÀÌ¿ÜÀÇ x, y °¡ °¡Àå ÀÛÀº Á¤ÀÇ Á¤¼öÀÌ´Ù Çظ¦, ±× Æç ¹æÁ¤½ÄÀÇ ÃÖ¼ÒÇضó°í ÇÑ´Ù. ¹æÁ¤½ÄÀÇ ¿ìº¯ c = -1 ·Î ÇßÀ» ¶§¿¡´Â ÇØ°¡ ¾ø´Â °æ¿ì°¡ ¸¹Áö¸¸, ±×·¯³ª -1 ¿¡ ´ë ÇÏ´Â ÃÖ¼ÒÇØ°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡´Â, ¹Ýµå½Ã ±× ÃÖ¼ÒÇØ ÂÊÀÌ +1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ º¸´Ù ÀÛ´Ù.
¿¹¸¦ µé¸é, M = 2 ÀÇ °æ¿ìÀÇ ¹æÁ¤½Ä¿¡ ´ëÇؼ´Â, x, y ÀÇ Æä¾î (1,1), (3,2), (7,5), (17,12), (41,29), (99,70), (239,169), (577,408)... ÇÏÁö¸¸ ±× ÇØÀÌÁö¸¸, -1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ´Â x=1, y=1 À̸ç,+1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ´Â x=2, y=3 ·Î .
Æç ¹æÁ¤½ÄÀÇ ÀϹÝÇØ´Â ´ÙÀ½ÀÇ Á¡È½Ä¿¡¼ ¿ä±¸µÈ´Ù.
¡¡¡¡¡¡¡¡xn+1 = x1xn + M y1yn
¡¡¡¡¡¡¡¡yn+1 = x1yn + y1xn
´Ù¸¸ x1, y1Àº ÃÖ¼ÒÇظ¦ ³ªÅ¸³½´Ù. µû¶ó¼ Æç ¹æÁ¤½Ä (À»)¸¦ Ç®·Á¸é ±× ÃÖ¼ÒÇظ¦ ¿ä±¸Çϸé ÁÁ´Ù.
M ÀÇ °ª¿¡ ÀÇÇØ, ÃÖ¼ÒÇØ°¡ ÀÇ¿Ü·Î Å« ¼ö°¡ µÇ´Â ÀÏÀÌ ÀÖ´Ù. ¿¹¸¦ µé¸é, M=61, c=1 ¿¡ ´ëÇÑ ÃÖ¼ÒÇØ´Â x=1766319049, y=226153980 ·Îµµ µÈ´Ù.
ÃÖ¼ÒÇØ´Â ´ÙÀ½°ú °°°Ô Á¡ÈÀûÀ¸·Î ¿ä±¸µÈ´Ù.
¡¡¡¡¡¡¡¡s0 = 0¡¡¡¡t0 = 1
¡¡¡¡¡¡¡¡a0 = M1/2 ÀÇ Á¤¼öºÎ
¡¡¡¡¡¡¡¡x-1 = 1¡¡¡¡y-1 = 0¡¡¡¡x0 = a0¡¡¡¡y0 = 1
¡¡¡¡¡¡¡¡sk+1 = aktk - sk¡¡¡¡
tk+1 = (M - sk+12) / tk
¡¡¡¡¡¡¡¡ak+1 = (a0 + sk+1) / tk+1ÀÇ
Á¤¼öºÎ
¡¡¡¡¡¡¡¡xk+1 = ak+1 xk + xk-1
¡¡¡¡yk+1 = ak+1 yk + yk-1
tk+1ÀÇ °ªÀÌ 1 ÀÌ µÇ¾úÀ» ¶§ÀÇ, xk, ykÀÇ °ª ÇÏÁö¸¸ Æç ¹æÁ¤½ÄÀÇ ÃÖ¼ÒÄ¡°¡ µÈ´Ù.