| 
									
										
										
										
											2008-10-03 03:19:03 -04:00
										 |  |  | ! Copyright (C) 2008 Doug Coleman. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  | USING: arrays combinators fry kernel macros make math math.bits | 
					
						
							|  |  |  | math.order math.vectors sequences splitting vectors ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: math.polynomials | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2008-11-08 16:03:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  | : 2pad-head ( p q n -- p q ) [ 0 pad-head ] curry bi@ ;
 | 
					
						
							|  |  |  | : 2pad-tail ( p q n -- p q ) [ 0 pad-tail ] curry bi@ ;
 | 
					
						
							| 
									
										
										
										
											2011-10-15 22:19:44 -04:00
										 |  |  | : pextend ( p q -- p q ) 2dup max-length 2pad-tail ;
 | 
					
						
							|  |  |  | : pextend-left ( p q -- p q ) 2dup max-length 2pad-head ;
 | 
					
						
							| 
									
										
										
										
											2008-09-06 18:15:25 -04:00
										 |  |  | : unempty ( seq -- seq ) [ { 0 } ] when-empty ;
 | 
					
						
							| 
									
										
										
										
											2008-03-29 21:36:58 -04:00
										 |  |  | : 2unempty ( seq seq -- seq seq ) [ unempty ] bi@ ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							| 
									
										
										
										
											2008-11-08 16:03:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | : powers ( n x -- seq )
 | 
					
						
							| 
									
										
										
										
											2009-05-05 19:34:52 -04:00
										 |  |  |     <repetition> 1 [ * ] accumulate nip ;
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : p= ( p q -- ? ) pextend = ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:31:52 -05:00
										 |  |  | : ptrim ( p -- q )
 | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  |     dup length 1 = [ [ zero? ] trim-tail ] unless ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:31:52 -05:00
										 |  |  | : 2ptrim ( p q -- p' q' ) [ ptrim ] bi@ ;
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | : p+ ( p q -- r ) pextend v+ ;
 | 
					
						
							|  |  |  | : p- ( p q -- r ) pextend v- ;
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  | ALIAS: n*p n*v | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 18:31:52 -05:00
										 |  |  | : pextend-conv ( p q -- p' q' )
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  |     2dup [ length ] bi@ + 1 - 2pad-tail ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | : p* ( p q -- r )
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  |     2unempty pextend-conv  | 
					
						
							|  |  |  |     [ drop length [ iota ] keep ] | 
					
						
							|  |  |  |     [ nip <reversed> ] | 
					
						
							|  |  |  |     [ drop ] 2tri
 | 
					
						
							| 
									
										
										
										
											2012-04-24 21:51:46 -04:00
										 |  |  |     '[ _ _ <slice> _ v* sum ] map reverse! ;
 | 
					
						
							| 
									
										
										
										
											2008-11-08 16:03:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  | : p-sq ( p -- p^2 ) dup p* ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-13 05:35:09 -05:00
										 |  |  | ERROR: negative-power-polynomial p n ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-13 22:47:44 -05:00
										 |  |  | : (p^) ( p n  -- p^n )
 | 
					
						
							|  |  |  |     make-bits { 1 } [ [ over p* ] when [ p-sq ] dip ] reduce nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-13 05:35:09 -05:00
										 |  |  | : p^ ( p n -- p^n )
 | 
					
						
							| 
									
										
										
										
											2010-02-13 22:47:44 -05:00
										 |  |  |     dup 0 >=
 | 
					
						
							|  |  |  |     [ (p^) ] | 
					
						
							|  |  |  |     [ negative-power-polynomial ] if ;
 | 
					
						
							| 
									
										
										
										
											2010-02-13 05:35:09 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : p/mod-setup ( p p -- p p n )
 | 
					
						
							|  |  |  |     2ptrim | 
					
						
							| 
									
										
										
										
											2008-03-29 21:36:58 -04:00
										 |  |  |     2dup [ length ] bi@ -
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     dup 1 < [ drop 1 ] when
 | 
					
						
							| 
									
										
										
										
											2009-05-06 00:32:23 -04:00
										 |  |  |     [ over length + 0 pad-head pextend ] keep 1 + ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  | : /-last ( seq1 seq2 -- x ) [ last ] bi@ / ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : (p/mod) ( p p -- p p )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     2dup /-last | 
					
						
							|  |  |  |     2dup , n*p swapd
 | 
					
						
							|  |  |  |     p- >vector
 | 
					
						
							| 
									
										
										
										
											2008-04-26 03:01:43 -04:00
										 |  |  |     dup pop* swap rest-slice ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | : p/mod ( p q -- z w )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     p/mod-setup [ [ (p/mod) ] times ] V{ } make | 
					
						
							|  |  |  |     reverse nip swap 2ptrim pextend ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : (pgcd) ( b a y x -- a d )
 | 
					
						
							| 
									
										
										
										
											2010-04-30 09:42:29 -04:00
										 |  |  |     dup V{ 0 } p= [ | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |         drop nip
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2009-01-23 19:20:47 -05:00
										 |  |  |         [ nip ] [ p/mod ] 2bi
 | 
					
						
							|  |  |  |         [ pick p* swap [ swapd p- ] dip ] dip (pgcd) | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-18 10:13:57 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : pgcd ( p q -- a d )
 | 
					
						
							| 
									
										
										
										
											2009-02-09 19:11:42 -05:00
										 |  |  |     [ V{ 0 } clone V{ 1 } clone ] 2dip swap (pgcd) [ >array ] bi@ ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : pdiff ( p -- p' )
 | 
					
						
							| 
									
										
										
										
											2010-07-05 23:40:53 -04:00
										 |  |  |     dup length iota v* rest ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-10 11:41:50 -04:00
										 |  |  | : polyval ( x p -- p[x] )
 | 
					
						
							| 
									
										
										
										
											2011-02-12 23:41:13 -05:00
										 |  |  |     ! Horner scheme | 
					
						
							|  |  |  |     [ nip <reversed> unclip-slice swap ] | 
					
						
							|  |  |  |     [ drop ] 2bi
 | 
					
						
							|  |  |  |     '[ [ _ * ] dip + ] each ;
 | 
					
						
							| 
									
										
										
										
											2009-05-10 11:41:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | MACRO: polyval* ( p -- )
 | 
					
						
							|  |  |  |     reverse
 | 
					
						
							| 
									
										
										
										
											2011-05-03 23:50:23 -04:00
										 |  |  |     [ rest [ \ * swap \ + [ ] 3sequence ] map ] | 
					
						
							| 
									
										
										
										
											2009-05-10 11:41:50 -04:00
										 |  |  |     [ first \ drop swap [ ] 2sequence ] bi
 | 
					
						
							|  |  |  |     prefix \ cleave [ ] 2sequence ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 |