jacobi Æò¹æ À׿© ±âÈ£ (a/p)ÀÇ °ªÀ» °è»êÇÑ´Ù
int jacobi(long a, long p);
a Æò¹æ À׿© ±âÈ£ÀÇ ºÐÀÚ p Æò¹æ À׿© ±âÈ£ÀÇ ºÐ¸ð
Æò¹æ À׿© ±âÈ£ÀÇ °ª +1 ¶Ç´Â -1. Àμö¿¡ ÀÇÇØ °è»ê ºÒ´ÉÀÇ °æ¿ì´Â 0.
int jacobi(long a, long p) { int x = 1; long tmp; if (p <= 0) return 0; if (p > 2 && (p & 1) == 0) return 0; if ((a = a % p) <= 0) return 0; while (a > 1) { if (a & 1) { if ((a & 3) == 3 && (p & 3) == 3) x = -x; tmp = p; p = a; a = tmp; a = a % p; } else { a >>= 1; if ((p & 7) == 3 || (p & 7) == 5) x = -x; } } if (a == 0) return 0; return x; }
¡¡¡¡¡¡¡¡x2¡Õa¡¡(mod p)
µÇ´Â x ´Â Á¸ÀçÇÒ ¶§¿Í Á¸ÀçÇÏÁö ¾ÊÀ» ¶§°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î, p = 7 ¶§
¡¡¡¡¡¡¡¡12¡Õ1, 22¡Õ4, 32¡Õ2,
42¡Õ2, 52¡Õ4, 62¡Õ1
À̱⠶§¹®¿¡, a¡Õ1 ¶Ç´Â 2 ¶Ç´Â 4 ¶§ ¸¶¼Å ÇØ°¡ ÀÖ´Ù. ÇØ°¡ ÀÖÀ» ¶§,
a ¸¦ mod p ¿¡¼ÀÇ Æò¹æ À׿©¶ó°í ÇÑ´Ù. a °¡ ÀÖ´Â ¼ö¸¦ Æò¹æ ÇØ p ·Î ³ª´« ³ª¸ÓÁö¿Í
µÇ±â ¶§¹®ÀÌ´Ù. ÇØ°¡ ¾øÀ» ¶§´Â, Æò¹æºñÀ׿©¶ó°í ÇÑ´Ù. ÀÌ ¶§,
¡¡¡¡¡¡¡¡(a/p)= 1 ¡¡¡¡ÇØ°¡ ÀÖ¾î
¡¡¡¡¡¡¡¡(a/p)=-1 ¡¡¡¡ÇØ°¡ ¾øÀ½
(ÀÌ)¶ó°í Á¤ÀǵȴÙ. ¶Ç, ÀÌ (a/p)¸¦ Æò¹æ À׿© ±âÈ£¶ó°í ÇÑ´Ù.
Æò¹æ À׿© ±âÈ£ÀÇ °ªÀ» °è»êÇϴµ¥, ÀÌÇÏÀÇ ¼ºÁúÀÌ ÀÌ¿ëµÈ´Ù.
¡¡¡¡¡¡¡¡(1/p) = 1
¡¡¡¡¡¡¡¡(ab/p) = (a/p)(b/p)
¡¡¡¡¡¡¡¡(2/p) = 1, p¡Õ1 ¶Ç´Â 7 (mod 8) ½Ã
¡¡¡¡¡¡¡¡(2/p) = -1, p¡Õ3 ¶Ç´Â 5 (mod 8) ½Ã
¡¡¡¡¡¡¡¡È¦¼ö a ¿Í ¼·Î ¼ø¼öÇÑ p ¿¡ ´ëÇؼ, Gauss Á¤¸®º¸´Ù
¡¡¡¡¡¡¡¡(a/p) = (p/a), p¡Õ1 ¶Ç´Â a¡Õ1 (mod 4) ½Ã
¡¡¡¡¡¡¡¡(a/p) = -(p/a), p¡Õ3 ¶ÇÇÑ a¡Õ3 (mod 4) ½Ã
À§ÀÇ ¼ºÁú·ÎºÎÅÍ, a ÀÇ °ªÀÌ È¦¼öÀΰ¡ ¦¼öÀΰ¡·Î ´Ù¸¥ 󸮸¦ ÇÑ´Ù. ¦¼öÀÇ °æ¿ì´Â, (2/p)ÀÇ °ªÀ» µé¿© µÎ¾î a ÀÚ½ÅÀÇ °ªÀ» ¹ÝÀ¸·Î ÇÑ´Ù. Ȧ¼öÀÇ °æ¿ì´Â, ºÐ¸ð¿Í ºÐÀÚ¸¦ ¹Ù²ã ³Ö¾î EuclidÈ£Á¦¹ýÀ» Àû¿ëÇÑ´Ù. ÀÌ ¹Ýº¹À» a °¡ 1 ÀÌ µÉ ¶§±îÁö ½Ç½ÃÇÑ´Ù.
µû¶ó¼, º»¾Ë°í¸®Áò¿¡¼´Â Æò¹æ À׿© ±âÈ£ÀÇ °ªÀ» log(p)¿¡ ºñ·Ê ½Ã°£¿¡ °è»êµÈ´Ù.