´Ù¹èÀå Á¤¼öÀÇ °ö¼À


ÇÔ¼ö¸í
mpMul  ´Ù¹èÀå Á¤¼ö³¢¸®ÀÇ °ö¼À
Çü½Ä
void mpMul(int *ret, int *a, int *b);
Àμö
ret   (Ãâ·Â) ´Ù¹èÀå Á¤¼ö³¢¸®ÀÇ °ö¼ÀÀÇ °á°ú(a * b)
a, b  (ÀÔ·Â) ´Ù¹èÀå Á¤¼ö
ÇÔ¼öÄ¡
¾øÀ½
ÁÖÀÇ »çÇ×
¹è¿­ÀÇ °¢ ¿ä¼Ò ai(i ´Â 1 ÀÌ»ó)´Â 1¾î¸¦ ³ªÅ¸³», 1¾î·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ÃÖ´ëÀÇ Á¤¼ö´Â 9999 ·Î ÇÑ´Ù. ¸»ÀÇ ±æÀÌ´Â a0 ÀÇ °ªÀ¸·Î ³ªÅ¸³½´Ù. Áï, ´Ù¹èÀå Á¤¼ö´Â
anKn-1+ an-1Kn-2+...+a2K+ a1
±×¸®°í Ç¥ÇöÇÑ´Ù. ´Ù¸¸, K=10000, n=a0.

¿ë·Ê(mpMul-test.c )

ÇÁ·Î±×·¥(mpMul.c )
#define N 10000

void mpMul(int *ret, int *a, int *b)
{
    int  i, j;
    int  la, lb;
    int  *aa;
    int  ca = 1;
    long x;

    la = *a;
    lb = *b;

    for (i = la + lb; i > 0; i--) *(ret + i) = 0;

    for (j = 1; j <= lb; j++) {
        ca = 0;
        for (i = 1, aa = a; i <= la; i++) {
            x = *++aa;
            x = x * *++b + *(ret + i + j - 1) + ca;
            *(ret + i + j - 1) = x % N;
            ca = x / N;
        }
        *(ret + i + j - 1) = ca;
    }
    
    *ret = (ca ! = 0) ?  la + lb : la + lb - 1;
}
¼³¸í
°ö¼ÀÀº °¡°¨(»óÅÂ)»ê¸¸Å­ ´Ü¼øÇÏÁö ¾Ê°í, ¿©·¯ °¡Áö ±Ã¸®ÀÇ ¿©Áö°¡ ÀÖ´Ù. ½Ç¿ë»ó ¶Ç´Â À̷лóÀÇ °üÁ¡À¸·ÎºÎÅÍ Èï¹Ì·Î¿î ¹æ¹ýÀ» ¾ó¸¶µçÁö »ý°¢µÇ°í ÀÖ´Ù.
°ö¼À¿¡ ´ëÇØ »ý°¢ÇÏÀÚ. a, b¸¦ °¢°¢ m, n¾î·Î Çϸé(ÀÚ), Àûc=a*b´Â m+n ¸»ÀÌÇÏ°¡ µÈ´Ù. Åë»óÀÇ ÇÊ»ê°ú °°Àº ¹æ¹ýÀ¸·Î, ½Â¼ö bÀÇ 1¾î ¸¶´Ù¸¦ a¿¡ °É¾î ±×·¯ÇÑ È­´Â Àûc°¡ µÈ´Ù.

ÀÌ ¹æ¹ý¿¡¼­´Â, bÀÇ n¾î¸¦ °¢°¢ aÀÇ m¾î¿¡ °É¹Ç·Î, m*nȸÀÇ ¹Ýº¹ µÈ´Ù. µû¶ó¼­, °è»ê¿¡ ÇÊ¿äÇÑ ½Ã°£Àº O(mn)ÀÌ´Ù.

°ü·Ã ÇÔ¼ö
´Ù¹èÀå Á¤¼öÀÇ °¡»ê, ´Ù¹èÀå Á¤¼öÀÇ °¨»ê, ´Ù¹èÀå Á¤¼öÀÇ Á¦»ê, ´Ù¹èÀå Á¤¼öÀÇ Æò¹æ±Ù, ´Ù¹èÀå Á¤¼öÀÇ ´ë¼Ò ºñ±³, ¼ö¿­À» ´Ù¹èÀå Á¤¼ö·Î º¯È¯ÇÏ´Â, ´Ù¹èÀå Á¤¼ö¸¦ ¼ö¿­·Î º¯È¯ÇÏ´Â, long Á¤¼ö¸¦ ´Ù¹èÀå Á¤¼ö·Î º¯È¯ÇÏ´Â, ´Ù¹èÀå Á¤¼ö¸¦ long Á¤¼ö·Î º¯È¯ÇÑ´Ù