다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Io 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.
p(x) = (x - a)q(x) + r
여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.
[참고]
* 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표
* 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Io 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.
p(x) = (x - a)q(x) + r
여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.
[참고]
* 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표
* 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수
- # Filename: testSyntheticDivision.io
- #
- # Purpose: Find the quotient and remainder when some polynomial is
- # divided by a monic polynomial of the first degree.
- #
- # Execute: io testSyntheticDivision.io -2 1 3 3 1
- // 사용법 표시
- printUsage := method (
- "Usage: io testSyntheticDivision.io [number] [coefficients of denominator]" println
- "Display the result of a synthetic division on the console." println
- )
- // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
- simplify := method(v,
- t := "" .. v
- if ((t size) > 2 and (t silce(t size - 2) == ".0")) then (
- t = t silce(t size - 2)
- )
- t
- )
- // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
- // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
- simplify := method(v, width,
- t := "" .. v
- if ((t size) > 2 and (t silce(t size - 2) == ".0")) then (
- t = t silce(t size - 2)
- )
- len := t size
- if (len < width) then (
- t = " " slice(0, width - len) .. t
- )
- t
- )
- // 다항식을 내림차순의 스트링 표현으로 반환
- toPolyString := method(c,
- t := ""
- sc0 := simplify(c at(0), 0 )
- if (c size > 2) then (
- if (sc0 == "1") then (
- t = t .. "x^" .. (c size - 1)
- ) elseif (sc0 == "-1") then (
- t = t .. "-x^" .. (c size - 1)
- ) else (
- t = t .. sc0 .. " x^" .. (c size - 1)
- )
- ) elseif (c size == 2) then (
- if (sc0 == "1") then (
- t = t .. "x"
- ) elseif (sc0 == "-1") then (
- t = t .. "-x"
- ) else (
- t = t .. sc0 .. " x"
- )
- ) elseif (c size == 1) then (
- t = t .. sc0
- )
- for (i, 1, c size - 1,
- k := c size - 1 - i
- sc := simplify(c at(i), 0)
- if (k > 1) then (
- if (c at(i) asNumber > 0.0) then (
- if (sc == "1") then (
- t = t .. " + " .. "x^" .. k
- ) else (
- t = t .. " + " .. sc .. " x^" .. k
- )
- ) elseif (c at(i) asNumber < 0.0) then (
- if (sc == "-1") then (
- t = t .. " + " .. "x^" .. k
- ) else (
- t = t .. " - " .. simplify(c at(i) abs, 0) .. " x^" .. k
- )
- )
- ) elseif (k == 1) then (
- if (c at(i) asNumber > 0.0) then (
- if (sc == "1") then (
- t = t .. " + " .. "x"
- ) else (
- t = t .. " + " .. sc .. " x"
- )
- ) elseif (c at(i) asNumber < 0.0) then (
- if (sc == "-1") then (
- t = t .. " - " .. "x"
- ) else (
- t = t .. " - " .. simplify(c at(i) asNumber abs, 0) .. " x"
- )
- )
- ) elseif (k == 0) then (
- if (c at(i) asNumber > 0.0) then (
- t = t .. " + " .. sc
- ) elseif (c at(i) asNumber < 0.0) then (
- t = t .. " - " .. simplify(c at(i) asNumber abs, 0)
- )
- )
- )
- t
- )
- // 다항식 나눗셈 결과를
- // (피제식) = (제식)(몫) + (나마지)
- // 형태로 출력
- printDivisionResult := method(a, c, b,
- (" " .. toPolyString(c)) print
- "" println
- (" = ( " .. toPolyString( list(1.0, -a) ) .. " )") print
- tmp := list()
- for (i, 0, b size - 2,
- tmp append(0.0)
- )
- for (i, 0, tmp size - 1,
- tmp atPut(i, b at(i) asNumber)
- )
- ("( " .. toPolyString(tmp) .. " )") print
- r := b at(b size - 1)
- if (r > 0.0) then (
- (" + " .. simplify(r, 0), 0) print
- ) elseif (r < 0.0) then (
- (" - " .. simplify(r abs, 0), 0) print
- )
- "" println
- )
- // 조립제법 계산표 출력 함수
- printSyntheticTable := method(a, c, s, q,
- simplify(c at(0), 6) print
- for (i, 1, c size - 1,
- (" " .. simplify(c at(i), 6)) print
- )
- "" println
- (simplify(a, 6) .. " | ") print
- simplify(s at(1), 6) print
- for (i, 2, s size - 1,
- (" " .. simplify(s at (i), 6)) print
- )
- "" println
- for (i, 0, q size - 1,
- )
- "" println
- simplify(q at(0), 6) print
- for (i, 1, q size - 1,
- (" " .. simplify(q at(i), 6)) print
- )
- "" println
- )
- // 실행 시작 지점
- if (args size < 4) then (
- printUsage()
- exit(1)
- )
- a := (args at(1)) asNumber
- c := list()
- s := list()
- b := list()
- for (i, 0, args size - 3,
- c append(args at(i + 2))
- )
- for (i, 0, c size - 1,
- s append(0.0)
- b append(0.0)
- )
- s atPut(0, 0.0)
- b atPut(0, c at(0))
- for (i, 1, c size - 1,
- s atPut(i, (b at(i-1) asNumber)*a )
- b atPut(i, (c at(i) asNumber) + (s at(i) asNumber) )
- )
- "The coefficents of quotient is " print
- for (i, 0, b size - 3,
- (simplify(b at(i), 0) .. ", " ) print
- )
- simplify(b at(b size - 2), 0) print
- (", and the remainder is " .. simplify(b at(b size - 1), 0) .. ".") println
- "" println
- printSyntheticTable(a, c, s, b)
- "" println
- printDivisionResult(a, c, b)
io 명령으로 아래와 같이 실행하여 보았다.
실행> io testSyntheticDivision.io 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
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Io' 카테고리의 다른 글
황금비율(golden ratio) 구하기 with Io (0) | 2008.04.15 |
---|---|
현재 시각 알아내기 for Io (0) | 2008.04.07 |
80컬럼 컨솔에 19단표 출력하기 예제 for Io (0) | 2008.04.07 |
(최대공약수 구하기) while ... 반복문 예제 for Io (0) | 2008.04.06 |
구구단 출력 예제 for Io (0) | 2008.04.06 |