다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
C 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 Ch를 사용하면 컴파일하지 않고 수정 없이 그대로 실행된다.
(실행 예:  ch testSyntheticDivision.c 1 2 3 4 5  )


  1. /*
  2.  *  Filename: testSyntheticDivision.c
  3.  *
  4.  *  Purpose:  Find the quotient and remainder when some polynomial is
  5.  *            divided by a monic polynomial of the first degree.
  6.  *
  7.  *  Compile:  cl testSyntheticDivision.c
  8.  *
  9.  *  Execute:  testSyntheticDivision -2 1 3 3 1
  10.  */
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <math.h>
  14. #include <memory.h>
  15. void print(char str[]) {
  16.     printf("%s", str);
  17. }
  18. void println(char str[]) {
  19.     printf("%s\n", str);
  20. }
  21. // 사용법 표시
  22. void printUsage() {
  23.      println("사용법: testSyntheticDivision [수] [피제식의 계수들]");
  24.      println("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.");
  25. }
  26. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  27. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  28. char *simplify(double v, int width) {
  29.     int n, len;
  30.     static char t[] = "                               ";
  31.     char tmp[] = "                               ";
  32.     sprintf(t, "%g", v);
  33.     n = strlen(t);
  34.     if ((n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0'))
  35.         t[n-2] = '\0';
  36.     len = strlen(t);
  37.     strcpy(tmp, t);
  38.     if (len < width) {
  39.         strncpy(t, "               ", width - len);
  40.         t[width - len] = '\0';
  41.         strcat(t, tmp);
  42.     }
  43.     return (char *) t;
  44. }
  45. // 다항식을 내림차순의 문자열로로 반환하는 함수
  46. // 반환된 문자열은 동적 메모리에 존재하므로.
  47. // 사용 후 반드시 해제(free)하여야 한다.
  48. char *toPolyString(double c[], int size) {
  49.     int SIZE = size;
  50.     int i;
  51.     static char t[300];
  52.     char tmp[80];
  53.     char *pc = simplify(c[0], -1);
  54.     char *pci;
  55.     if (SIZE > 2) {
  56.         if (strlen(pc) == 1 && pc[0] == '1')
  57.             sprintf(t,  "x^%d", SIZE - 1);
  58.         else if (strlen(pc) == 2 && pc[0] == '-' && pc[1] == '1')
  59.             sprintf(t,  "-x^%d", SIZE - 1);
  60.         else
  61.             sprintf(t,  "%s x^%d", simplify(c[0], -1), SIZE - 1);
  62.     }
  63.     else if (SIZE == 2) {
  64.         if (strlen(pc) == 1 && pc[0] == '1')
  65.             strcpy(t,  "x");
  66.         else if (strlen(pc) == 2 && pc[0] == '-' && pc[1] == '1')
  67.             strcpy(t,  "-x");
  68.         else
  69.             sprintf(t,  "%s x", simplify(c[0], -1));
  70.     }
  71.     else if (SIZE == 1) {
  72.         sprintf(t,  "%s", simplify(c[0], -1));
  73.     }
  74.     for (i = 1; i < SIZE; i++) {
  75.         pci = simplify(c[i], -1);
  76.         if (SIZE - 1 - i > 1) {
  77.             if (c[i] > 0.0) {
  78.                 if (strlen(pci) == 1 && pci[0] == '1') {
  79.                     sprintf(tmp,  " + x^%d", SIZE - 1 - i);
  80.                     strcat(t, tmp);
  81.                 }
  82.                 else {
  83.                     sprintf(tmp,  " + %s x^%d", simplify(c[i], -1), SIZE - 1 - i);
  84.                     strcat(t, tmp);
  85.                 }
  86.             }
  87.             else if (c[i] < 0.0) {
  88.                 if (strlen(pci) == 2 && pci[0] == '-' && pci[1] == '1') {
  89.                     sprintf(tmp,  " - x^%d", SIZE - 1 - i);
  90.                     strcat(t, tmp);
  91.                 }
  92.                 else {
  93.                     sprintf(tmp,  " - %s x^%d", simplify(fabs(c[i]), -1), SIZE - 1 - i);
  94.                     strcat(t, tmp);
  95.                 }
  96.             }
  97.         }
  98.         else if (SIZE - 1 - i == 1) {
  99.             if (c[i] > 0.0) {
  100.                 if (strlen(pci) == 1 && pci[0] == '1') {
  101.                     strcat(t, " + x");
  102.                 }
  103.                 else {
  104.                     sprintf(tmp,  " + %s x", simplify(c[i], -1));
  105.                     strcat(t, tmp);
  106.                 }
  107.             }
  108.             else if (c[i] < 0.0) {
  109.                 if (strlen(pci) == 2 && pci[0] == '-' && pci[1] == '1') {
  110.                     strcat(t, " - x");
  111.                 }
  112.                 else {
  113.                     sprintf(tmp,  " - %s x", simplify(fabs(c[i]), -1));
  114.                     strcat(t, tmp);
  115.                 }
  116.             }
  117.         }
  118.         else if (SIZE - 1 - i == 0) {
  119.             if (c[i] > 0.0) {
  120.                 sprintf(tmp,  " + %s", simplify(c[i], -1));
  121.                 strcat(t, tmp);
  122.             }
  123.             else if (c[i] < 0.0) {
  124.                 sprintf(tmp,  " - %s", simplify(fabs(c[i]), -1));
  125.                 strcat(t, tmp);
  126.             }
  127.         }
  128.     }
  129.     return (char *) t;
  130. }
  131. // 다향식 나눗셈 결과를
  132. //     (피제식) = (제식)(몫) + (나마지)
  133. // 형태로 출력
  134. void printDivisionResult(double a, double c[], double b[], int size) {
  135.     int SIZE = size;
  136.     int i;
  137.     double *pTmpPoly;
  138.     double r;
  139.     double monic[] = { 1.0, 0.0 };
  140.     print("  ");
  141.     print(toPolyString(c, SIZE));
  142.     println("");
  143.     print("    = ( ");
  144.     monic[1] = -a;
  145.     print(toPolyString(  monic, 2 ));
  146.     print(" )");
  147.     pTmpPoly = (double *)  calloc(SIZE - 1, sizeof(double));
  148.     for (i = 0; i < SIZE - 1; i++) {
  149.         pTmpPoly[i] = b[i];
  150.     }
  151.     print("( ");
  152.     print(toPolyString(pTmpPoly, SIZE - 1));
  153.     print(" )");
  154.     free(pTmpPoly);
  155.     r = b[SIZE - 1];
  156.     if (r > 0.0) {
  157.         print(" + ");
  158.         print(simplify(r, -1));
  159.     }
  160.     else if (r < 0.0) {
  161.         print(" - ");
  162.         print(simplify(fabs(r), -1));
  163.     }
  164.     println("");
  165. }
  166. // 조립제법 계산표 출력 함수
  167. void printSyntheticTable(double a, double c[], double s[], double q[], int size) {
  168.     int SIZE = size;
  169.     int i;
  170.     print("       | ");
  171.     print(simplify(c[0], 6));
  172.     for (i = 1; i < SIZE; i++) {
  173.         print("  ");
  174.         print(simplify(c[i], 6));
  175.     }
  176.     println("");
  177.     print(simplify(a, 6));
  178.     print(" | ");
  179.     print("        ");
  180.     print(simplify(s[1], 6));
  181.     for (i = 2; i < SIZE; i++) {
  182.         print("  ");
  183.         print(simplify(s[i], 6));
  184.     }
  185.     println("");
  186.     print("       |-");
  187.     for (i = 0; i < SIZE; i++) {
  188.         print("--------");
  189.     }
  190.     println("");
  191.     print("         ");
  192.     print(simplify(q[0], 6));
  193.     for (i = 1; i < SIZE; i++) {
  194.         print("  ");
  195.         print(simplify(q[i], 6));
  196.     }
  197.     println("");
  198. }
  199. // C/C++/Ch 언어의 실행 시작 지점
  200. int main(int argc, char *argv[]) {
  201.     int i;
  202.     int SIZE = argc - 2;
  203.     double a, c[15], s[15], b[15];
  204.     if (argc < 4) {
  205.         printUsage();
  206.         exit(1);
  207.     }
  208.     //////////////////////////////////////////////////////
  209.     // 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  210.     // 제식은 x -  a
  211.     a = atof(argv[1]);
  212.     for (i = 0; i < SIZE; i++) {
  213.         c[i] = atof(argv[i + 2]);
  214.     }
  215.     //////////////////////////////////////////////////////
  216.     // 조립제법의 주요 부분
  217.     s[0] = 0.0;
  218.     b[0] = c[0];
  219.     for (i = 1; i < SIZE; i++) {
  220.         s[i] = b[i-1]*a;
  221.         b[i] = c[i] + s[i];
  222.     }
  223.     //////////////////////////////////////////////////////
  224.     // 몫의 계수와 나머지를 출력한다.
  225.     print("몫의 계수는 ");
  226.     for (i = 0; i < SIZE - 2; i++) {
  227.         print(simplify(b[i], -1));
  228.         print(", ");
  229.     }
  230.     print(simplify(b[SIZE - 2], -1));
  231.     print(" 이고, 나머지는 ");
  232.     print(simplify(b[SIZE - 1], -1));
  233.     println(" 이다.");
  234.     println("");
  235.     //////////////////////////////////////////////////////
  236.     // 조립제법 표를 출력한다.
  237.     printSyntheticTable(a, c, s, b, SIZE);
  238.     println("");
  239.     //////////////////////////////////////////////////////
  240.     // (피제식) = (제식) x (몫) + (나머지)
  241.     printDivisionResult(a, c, b, SIZE);
  242.     return 0;
  243. }




컴파일> cl testSyntheticDivision.c

실행> testSyntheticDivision 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 14 이다.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



 

Posted by Scripter
,
다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Java 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 Ruby용 소스파일 testSyntheticDivision.rb 를 Lua용으로 수정한 것이다.


  1. --[[
  2.   Filename: testSyntheticDivision.lua
  3.   Purpose:  Find the quotient and remainder when some polynomial is
  4.             divided by a monic polynomial of the first degree.
  5.   Execute:  lua testSyntheticDivision.lua -2 1 3 3 1
  6. --]]
  7. -- 사용법 표시
  8. function printUsage()
  9.     print("사용법: lua testSyntheticDivision.lua [수] [피제식의 계수들]")
  10.     print("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.")
  11. end   
  12. -- 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  13. -- 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  14. function simplify(v, width)
  15.     t = "" .. v
  16.     tlen = string.len(t)
  17.     if string.sub(t, tlen-2) == ".0" then
  18.         t = string.sub(t, 0, tlen-2)
  19.     end
  20.     if width ~= nil then
  21.         if tlen < width then
  22.             t = string.sub("              ", 0, width - tlen) .. t
  23.         end
  24.     end
  25.     return t
  26. end
  27. -- 다항식을 내림차순의 스트링 표현으로 반환
  28. function toPolyString(c)
  29.     local t = ""
  30.     sc0 = simplify(c[1], null)
  31.     if #c > 2 then
  32.         if sc0 == "1" then
  33.             t = t .. "x^" .. (#c-1)
  34.         elseif sc0 == "-1" then
  35.             t = t .. "-x^" .. (#c-1)
  36.         else
  37.             t = t .. sc0 .. " x^" .. (#c-1)
  38.         end
  39.     elseif #c == 2 then
  40.         if sc0 == "1" then
  41.             t = t .. "x"
  42.         elseif sc0 == "-1" then
  43.             t = t .. "-x"
  44.         else
  45.             t = t .. sc0 .. " x"
  46.         end
  47.     elseif #c == 1 then
  48.         t = t .. sc0
  49.     end
  50.     for i = 2, #c do
  51.         k = #c - i
  52.         sc = simplify(c[i], nil)
  53.         if k > 1 then
  54.             if c[i] > 0.0 then
  55.                 if sc == "1" then
  56.                     t = t .. " + " .. "x^" .. k
  57.                 else
  58.                     t = t .. " + " .. sc .. " x^" .. k
  59.                 end
  60.             elseif c[i] < 0.0 then
  61.                 if sc == "-1" then
  62.                     t = t .. " - " .. "x^" .. k
  63.                 else
  64.                     t = t .. " - " .. simplify(math.abs(c[i]), nil) .. " x^" .. k
  65.                 end
  66.             end
  67.         elseif k == 1 then
  68.             if c[i] > 0.0 then
  69.                 if sc == "1" then
  70.                     t = t .. " + " .. "x"
  71.                 else
  72.                     t = t .. " + " .. sc .. " x"
  73.                 end
  74.             elseif c[i] < 0.0 then
  75.                 if sc == "-1" then
  76.                     t = t .. " - " .. "x"
  77.                 else
  78.                     t = t .. " - " .. simplify(math.abs(c[i]), null) .. " x"
  79.                 end
  80.             end
  81.         elseif k == 0 then
  82.             if c[i] > 0.0 then
  83.                 t = t .. " + " .. sc
  84.             elseif c[i] < 0.0 then
  85.                 t = t .. " - " .. simplify(math.abs(c[i]), null)
  86.             end
  87.         end
  88.     end
  89.     return t
  90. end
  91. -- 다향식 나눗셈 결과를
  92. --     (피제식) = (제식)(몫) + (나마지)
  93. -- 형태로 출력
  94. function printDivisionResult(a, c, b)
  95.     local strLine = "  " .. toPolyString(c)
  96.     io.write( strLine .. "\n")
  97.     strLine = "    = ( " .. toPolyString( { 1.0, -a } ) .. " )"
  98.     tmp = { }
  99.     for i = 1, #b - 1 do
  100.         tmp[i] = b[i]
  101.     end
  102.     strLine = strLine .. "( " .. toPolyString(tmp) .. " )"
  103.     r = b[#b]
  104.     if r > 0.0 then
  105.         strLine = strLine .. " + " .. simplify(r, nil)
  106.     elseif r < 0.0 then
  107.         strLine = strLine .. " - " .. simplify(math.abs(r), nil)
  108.     end
  109.     io.write( strLine .. "\n" )
  110. end
  111. -- 조립제법 계산표 출력 함수
  112. function printSyntheticTable(a, c, s, q)
  113.     strLine = "       | "
  114.     strLine = strLine .. simplify(c[1], 6)
  115.     for i = 2, #c do
  116.         strLine = strLine .. "  " .. simplify(c[i], 6)
  117.     end
  118.     io.write( strLine .. "\n" )
  119.     strLine = simplify(a, 6) ..  " |"
  120.     strLine = strLine .. "         "
  121.     strLine = strLine .. simplify(s[2], 6)
  122.     for i = 3, #s do
  123.         strLine = strLine .. "  " .. simplify(s[i], 6)
  124.     end
  125.     io.write( strLine .. "\n" )
  126.     strLine = "       |"
  127.     for i = 1, #q do
  128.         strLine = strLine .. "--------"
  129.     end
  130.     io.write( strLine .. "\n" )
  131.     strLine = "         "
  132.     strLine = strLine .. simplify(q[1], 6)
  133.     for i = 2, #q do
  134.         strLine = strLine .. "  " .. simplify(q[i], 6)
  135.     end
  136.     io.write( strLine .. "\n" )
  137. end
  138. -- 실행 시작 지점
  139. if #arg < 3 then
  140.     printUsage()
  141.     os.exit(1)
  142. end
  143. -- 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  144. -- 제식은 x -  a
  145. a = arg[1]
  146. c = { }
  147. s = { }
  148. b = { }
  149. for i = 1, #arg-1 do
  150.     c[i] = tonumber(arg[i + 1])
  151. end
  152. -- 조립제법의 주요 부분
  153. s[1] = 0.0
  154. b[1] = c[1]
  155. for i = 2, #c do
  156.     s[i] = b[i-1]*a
  157.     b[i] = c[i] + s[i]
  158. end
  159. -- 몫의 계수와 나머지를 출력한다.
  160. io.write("몫의 계수는 ")
  161. for i = 1, #b-1 do
  162.     io.write(simplify(b[i], nil) .. ", ");
  163. end
  164. io.write(simplify(b[#b], nil) .. " ")
  165. io.write("이고, 나머지는 " .. simplify(b[#b], nil) .. " 이다." .. "\n")
  166. io.write("\n")
  167. -- 조립제법 표를 출력한다.
  168. printSyntheticTable(a, c, s, b)
  169. io.write("\n")
  170. -- (피제식) = (제식) x (몫) + (나머지)
  171. printDivisionResult(a, c, b)




실행> lua testSyntheticDivision.lua 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 14 이다.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,
다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Ruby 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 Python용 소스파일 testSyntheticDivision.py 를 Ruby용으로 수정한 것이다.

ruby 대신 jruby 로도 수정 없이 그대로 실행된다.


  1. =begin
  2.   Filename: testSyntheticDivision.rb
  3.   Purpose:  Find the quotient and remainder when some polynomial is
  4.             divided by a monic polynomial of the first degree.
  5.   Execute:  ruby testSyntheticDivision.rb -2 1 3 3 1
  6.         Or  jruby testSyntheticDivision.rb -2 1 3 3 1
  7. =end
  8. # 사용법 표시
  9. def printUsage()
  10.     print("사용법: ruby testSyntheticDivision.rb [수] [피제식의 계수들]" + "\n")
  11.     print("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다." + "\n")
  12. end
  13. # 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  14. # 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  15. def simplify(v, width)
  16.     t = "%d" % v
  17.     tlen = t.length
  18.     if t[(tlen-2)..(tlen-1)] == ".0"
  19.         t = t[0..(tlen-2)]
  20.     end
  21.     if width != nil
  22.         if tlen < width
  23.             t = "              "[0...(width - tlen)] + t
  24.         end
  25.     end
  26.     return t
  27. end
  28. # 다항식을 내림차순의 스트링 표현으로 반환
  29. def toPolyString(c)
  30.     t = ""
  31.     sc0 = simplify(c[0], nil)
  32.     if c.length > 2
  33.         if sc0 == "1"
  34.             t += "x^%d" % (c.length-1)
  35.         elsif sc0 == "-1"
  36.             t += "-x^%d" % (c.length-1)
  37.         else
  38.             t += sc0 + " x^%d" % (c.length-1)
  39.         end
  40.     elsif c.length == 2
  41.         if sc0 == "1"
  42.             t += "x"
  43.         elsif sc0 == "-1"
  44.             t += "-x"
  45.         else
  46.             t += sc0 + " x"
  47.         end
  48.     elsif c.length == 1
  49.         t += sc0
  50.     end
  51.     for i in 1...c.length do
  52.         k = c.length - 1 - i
  53.         sc = simplify(c[i], nil)
  54.         if k > 1
  55.             if c[i] > 0.0
  56.                 if sc == "1"
  57.                     t += " + " + "x^" + k
  58.                 else
  59.                     t += " + " + sc + " x^%d" % k
  60.                 end
  61.             elsif c[i] < 0.0
  62.                 if sc == "-1"
  63.                     t += " - " + "x^" + k
  64.                 else
  65.                     t += " - " + simplify(c[i].abs, nil) + " x^%d" % k
  66.                 end
  67.             end
  68.         elsif k == 1
  69.             if c[i] > 0.0
  70.                 if sc == "1"
  71.                     t += " + " + "x"
  72.                 else
  73.                     t += " + " + sc + " x"
  74.                 end
  75.             elsif c[i] < 0.0
  76.                 if sc == "-1"
  77.                     t += " - " + "x"
  78.                 else
  79.                     t += " - " + simplify(c[i].abs, nil) + " x"
  80.                 end
  81.             end
  82.         elsif k == 0
  83.             if c[i] > 0.0
  84.                 t += " + " + sc
  85.             elsif c[i] < 0.0
  86.                 t += " - " + simplify(c[i].abs, nil)
  87.             end
  88.         end
  89.     end
  90.     return t
  91. end
  92. # 다향식 나눗셈 결과를
  93. #     (피제식) = (제식)(몫) + (나마지)
  94. # 형태로 출력
  95. def printDivisionResult(a, c, b)
  96.     strLine = "  " + toPolyString(c)
  97.     print( strLine + "\n")
  98.     strLine = "    = ( " + toPolyString( [1.0, -a] ) + " )"
  99.     tmp = [0.0] * (b.length - 1)
  100.     for i in 0...tmp.length do
  101.         tmp[i] = b[i]
  102.     end
  103.     strLine += "( " + toPolyString(tmp) + " )"
  104.     r = b[b.length - 1]
  105.     if r > 0.0
  106.         strLine += " + " + simplify(r, nil)
  107.     elsif r < 0.0
  108.         strLine += " - " + simplify(r.abs, nil)
  109.     end
  110.     print( strLine + "\n" )
  111. end
  112. # 조립제법 계산표 출력 함수
  113. def printSyntheticTable(a, c, s, q)
  114.     strLine = "       | "
  115.     strLine += simplify(c[0], 6)
  116.     for i in 1...c.length do
  117.         strLine += "  " + simplify(c[i], 6)
  118.     end
  119.     print( strLine + "\n" )
  120.     strLine = simplify(a, 6) + " |"
  121.     strLine += "         "
  122.     strLine += simplify(s[1], 6)
  123.     for i in 2...s.length do
  124.         strLine += "  " + simplify(s[i], 6)
  125.     end
  126.     print( strLine + "\n" )
  127.     strLine = "       |"
  128.     for i in 0...q.length do
  129.         strLine += "--------"
  130.     end
  131.     print( strLine + "\n" )
  132.     strLine = "         "
  133.     strLine += simplify(q[0], 6)
  134.     for i in 1...q.length do
  135.         strLine += "  " + simplify(q[i], 6)
  136.     end
  137.     print( strLine + "\n" )
  138. end
  139. # 실행 시작 지점
  140. if ARGV.length < 2
  141.     printUsage()
  142.     exit(1)
  143. end
  144. ######################################################
  145. # 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  146. # 제식은 x -  a
  147. a = ARGV[0].to_f
  148. c = [0.0]*(ARGV.length - 1)
  149. s = [0.0]*(+ARGV.length - 1)
  150. b = [0.0]*(ARGV.length - 1)
  151. for i in 0...c.length do
  152.     c[i] = ARGV[i + 1].to_f
  153. end
  154. ######################################################
  155. # 조립제법의 주요 부분
  156. s[0] = 0.0
  157. b[0] = c[0]
  158. for i in 1...c.length do
  159.     s[i] = b[i-1]*a
  160.     b[i] = c[i] + s[i]
  161. end
  162. ######################################################
  163. # 몫의 계수와 나머지를 출력한다.
  164. print("몫의 계수는 ")
  165. for i in 0...(b.length - 2) do
  166.     print(simplify(b[i], nil) + ", " )
  167. end
  168. print(simplify(b[b.length - 2], nil) + " ")
  169. print("이고, 나머지는 " + simplify(b[b.length - 1], nil) + " 이다." + "\n")
  170. print("\n")
  171. ######################################################
  172. # 조립제법 표를 출력한다.
  173. printSyntheticTable(a, c, s, b)
  174. print("\n")
  175. ######################################################
  176. # (피제식) = (제식) x (몫) + (나머지)
  177. printDivisionResult(a, c, b)




실행> ruby testSyntheticDivision.rb 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 14 이다.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,