Polynomial Division Program for the HP28.
The HP28 can't calculate the quotient and the remainder
of polynomial division by itself.
However, if the polynomials are entered as vectors,
the PDiv program returns the quotient on lvl.2 and
the remainder on lvl.1
Ex.1 ( X^3 + 2*X^2 + 2*X + 1 ) / ( X + 1 )
PDiv
2: [ 1 2 2 1 ] => 2: [ 1 1 1 ]
1: [ 1 1 ] => 1: [ 0 ]
quotient : X^2 + X + 1
remainder: 0
PDiv divides complex polynomials too.
Ex.2 ( Z^3 + Z^2 + 2*i*Z^2 + Z + 1 + 2*i ) / ( Z^2 + 1 )
PDiv
2: [ (1,0) (1,2) (1,0) (1,2) ] => 2: [ (1,0) (1,2) ]
1: [ 1 0 1 ] => 1: [ (0,0) ]
quotient : Z + 1 + 2*i
remainder: 0
Remarks: * PDiv will not work if a vector has a 0 or (0,0)
as first element. [ 0 1 2 ] must be entered as
[ 1 2 ].
* The vector on lvl.1 must have at least two
elements. If your divisor is a polynomial
of degree 0, you don't need PDiv.
And now the programs:
***
PDiv ; divides two polynomial vectors
<<
[ 0 ] ; put the quotient on lvl.3
3 ROLLD V->L SWAP ; convert divisor.vector to list
OVER DUP2
WHILE SIZE SWAP ; loop until...
VSize DUP ROT >= ; degree.remainderLIST ; result, temporary represented...
3 ROLLD ; as { 1 }, is put on lvl.3
WHILE DUP2 SWAP ; loop until...
SIZE > ; size.divisor.list=degree.remainder
REPEAT ROT 0 + ; increase degree of divisor and...
ROT 0 + ROT ; result by 1.loop end
END DROP SWAP 5 ; put result on lvl.5. get 1st elem-
ROLLD OVER 1 GET ; ents of rem.vec &res.list /
OVER 1 GET / DUP 7 ; get result , * k, get quotient,VAdd
ROLL L->V * 6 ROLL ; put new quotient on lvl.5
VAdd 5 ROLLD SWAP ; swap down divisor.list convert to..
L->V * - Cut OVER ; vector, * k, -, Cut, -> new remainder
DUP2 ; swap down divisor dup2
END DROP2 3 ROLLD ; loop end
DROP SWAP
>>
***
VSize
<< SIZE 1 GET ; get size of vector
>>
***
Cut ; cut zeroes [ 0 0 1 2 ] -> [ 1 2 ]
<< 1 0 ROT ARRY-> 1
GET DUP
IF 1 - ; check (size of vector - 1)
THEN 1 + ; if size of vector > 1
DO DUP PICK ABS ; loop until picked abs > ' 0 '
.00000000001 > SWAP
OVER NOT - SWAP ; decrease lvl to pick from by truthvalue
UNTIL
END ; loop end
IF 1 - DUP ; checks no. of elements <> 0
THEN 1 ->LIST ; if no.>0 put no. ->list
ELSE 1 + 1 ->LIST ; if all elements are 0 then 1 ->list
END ->ARRY ; make vector
DO SWAP DROP ; get rid of zeroes above lvl.1
UNTIL OVER ABS
.00000000001 >
END SWAP DROP ; swap the 1 down drop it
ELSE 1 ->LIST ->ARRY ; can't cut vector of size 1
3 ROLLD DROP2 ; make vector , drop 0 1
END
>>
***
L->V ; { 1 2 3 4 5 } -> [ 1 2 3 4 5 ]
<< LIST-> 1 ->LIST
->ARRY
>>
***
V->L ; [ 5 4 3 2 1 ] -> { 5 4 3 2 1 }
<< ARRY-> LIST-> DROP
->LIST
>>
***
VAdd ; adds polynomial vectors of different sizes
<< DUP2 VSize SWAP
VSize - DUP ; get difference in sizes
IF 0 == ; if sizes is same
THEN DROP ; drop difference
ELSE DUP
IF 0 > ; if the 'bigger' vector was on lvl.1
THEN ROT SWAP ; swap lvl2. and lvl.3
ELSE ABS
END FillN ; fill vector on lvl.2 so vectors have...
END + ; equal sizes. add them
>>
***
FillN ; takes integer n, from lvl.1 .put n zeroes
<< -> n ; on the left side of vector at lvl.2
<< 1 n
START 0 SWAP
NEXT ARRY-> LIST->
SWAP n
>> + SWAP ->LIST
->ARRY
>>
***
I'm not used too write comments to my programs,
so they might be a little bit strange.
When I made my first verion of PDiv I had to
do a lot of thinking to make it work.
Then I have optimized the speed of calculation
as far as I can (by now).
I have programmed the HP28 for about 4 month,
so I'm not that experienced.
Comments on errors and further optimization
are welcome indeed.
As a challenge I've tried to write a program
that converts an algebraic-polynomial to
a polynomial vector. It is quite easily done
if the polynomial is real. But a complex-
polynomial isn't easy if you don't write a
very big(and slow) program.
I hope that I havn't made any typing errors...
Mikael Sundstrom Lulea University
------------------------------------------------------------------------------
Hello net
Here is a little program I wrote that divide two polynoms.The program receive
two vectors of coefficent and return a vector with the division result and
another one with the reminder .I also include a program that transform a
coefficent vector to a polynom.
div [D3C4] ; This is the main program but all the work is done by DIVV
<< DUP SIZE ! GET -> a b c
<< a b WHILE OVER SIZE
1 GET c REPEAT DIVV EDD
DROP -> e
<< a SIZE 1 GET c 1 - -
->LIST ->ARRY e
>>
>>
>>
DIVV [3075] ; This program is used by the previous one
<< DUP 1 GET -> a b c
<< a 1 GET c / DUP b * a SIZE RDM a
SWAP - ARRY-> 1 GETI 1 - PUT
->ARRY SWAP DROP b
>>
>>
poly [B9C2] ; This program expect a vector and a algebraic object
; and return a polynom in this object.
<< -> a x
<< a SIZE 1 GET -> c
<< 0 0 c 1 - FOR j
x j ^ a c j - GET * +
NEXT
>>
>>
>>
B.T.W can anyone tell me how to send programs to the HP28 server
without having FTP access ?
Thats all for today.
Bye
Eliel Louzoun
Jerusalem
Israel .