ãã®èšäºã§ã¯ãHaskellèšèªã§GrobnerããŒã¹ã«é¢é£ããã¢ã«ãŽãªãºã ãã©ã®ããã«å®è£
ãããã«ã€ããŠã話ããããšæããŸãã 誰ããç§ã®ã¢ã€ãã¢ã説æã圹ç«ã€ãšæãããšãé¡ã£ãŠããŸãã çè«ã«ã€ããŠã¯èª¬æããŸããã®ã§ãèªè
ã¯å€é
åŒç°ã®æŠå¿µãç°ã®çæ³ããããŠçæ³ã®åºç€ã«ç²ŸéããŠããå¿
èŠããããŸãã
ãã® ICMMOã®æ¬ãèªãããšããå§ãããŸããããã«ã¯ãå¿
èŠãªçè«ããã¹ãŠè©³çŽ°ã«èª¬æãããŠããŸãã
ãã®èšäºã®äž»ãªäž»é¡ã¯ãããã€ãã®å€æ°ã®å€é
åŒç°ã®çæ³ã®ã°ã¬ãããŒåºåºã§ãã ãã®æŠå¿µã¯ãå€é
æ¹çšåŒã®ã·ã¹ãã ãç 究ãããšãã«çããŸãã èšäºã®æåŸã§ããããã®ã¢ã€ãã¢ãã©ã®ããã«é©çšã§ããããäŸã§ç€ºããŸãã
ãã®çè«ãäžããæãéèŠãªçµæã¯ãããã€ãã®å€æ°ã§æ¹çšåŒã®å€é
åŒã·ã¹ãã ã解ãããã®è¯ãæ¹æ³ã§ãã é«ç代æ°ãHaskellã«ç²ŸéããŠããªãå Žåã§ãããããã®åã解æ³ã¯åŠçãã¢ã¯ã»ã¹å¯èœãªã¬ãã«ã§èª¬æãããŠãããçè«å
šäœã¯æ£åœåããããã«ã®ã¿å¿
èŠãªã®ã§ããã®èšäºãèªãããšããå§ãããŸãã é«ç代æ°ã«é¢é£ãããã¹ãŠãå®å
šã«ã¹ãããããæ¹çšåŒç³»ã解ãæ¹æ³ãåŠã¶ããšãã§ããŸãã
èå³ããããªããç«ã®äžã§ãé¡ãããŸãã
ç³ãèš³ãããŸããããããã¯ã©ããã¯ã¹ã§ã¬ã³ããªã³ã°ãããŠããŸãããhabrã«style="width:...;height=...;"
ç解ãããæ¹æ³ ç¥ããŸãã ããè¯ãæ¹æ³ãæããŠããã ããã°ãééããªãããçŽããŸãã1代æ°ããæãå¿
èŠãªæŠå¿µ
ç¹å®ã®ã«ãŒã«ïŒè»žïŒã«å¯Ÿå¿ãããå ç®ããšãä¹ç®ãã®2ã€ã®æäœãæå®ã§ããèŠçŽ ã®ã»ããã¯ã代æ°ã®
ãªã³ã°ãšåŒã°ããŸãã ä¿æ°ãå®æ°ã§ããããã€ãã®å€æ°ã®å€é
åŒã¯ã
ãå€é
åŒã®å ç®ããã³ä¹ç®ã®éåžžã®åŠæ ¡æäœã«é¢é£ããŠã ãªã³ã°
ã®çæ³ã¯ããã®ãããªãµãã»ããã§ããããã®2ã€ã®èŠçŽ ã®å·®ã¯ãã®äžã«ããããã®èŠçŽ ã®ãããããšãªã³ã°ã®ä»»æã®èŠçŽ ã®ç©ã¯ãã®ãµãã»ããã«ãããŸãã çæ³ã®æãåçŽãªäŸã¯ãæŽæ°ã®ç°ã®çæ³ãšããŠã®è€æ°ã®5ã€ã®æ°åã®ã»ããã§ãã ãããçæ³çã§ããããšã確èªããŠãã ããã ããŸãããã°ããã以äžåé¡ã¯ãããŸããã
ããã«ãå€é
åŒç°ã®çæ³ã®ã¿ãèæ
®ããŸãã å€é
åŒã®ããã€ãã®æééå
çæ³ã®å€é
åŒã次ã®ããã«è¡šçŸã§ããå Žå
ãçæ³ã®
åºåºãšåŒã°ããŸã
ã©ãã§
-ããã€ãã®å€é
åŒã ãã®äºå®ã¯æ¬¡ã®ããã«æžãããŠããŸãã
ã ãã«ãã«ãã®åºåºå®çã¯é©ãã¹ãçµæããããããŸã-ïŒå€é
åŒç°å
ã®ïŒçæ³ã«ã¯æéã®åºåºããããŸãã ããã«ãããããããç¶æ³ã§äœæ¥ããããšãã§ããçæ³ã®æéããŒã¹ã§äœæ¥ããããšãã§ããŸãã
次ã«ã次ã®åœ¢åŒã®é£ç«æ¹çšåŒãèããŸãã
ãã®ã·ã¹ãã ã®çæ³ãçæ³ãšåŒã³ãŸã
ã 代æ°ããçæ³çã«æšªããã£ãŠããå€é
åŒã¯
å
ã®ã·ã¹ãã ã®ä»»æã®ãœãªã¥ãŒã·ã§ã³ã§æ¶ããŸãã ãããŠããã«ã
-çæ³ã®ããäžã€ã®åºç€
ãã®åŸãã·ã¹ãã
å
ã®ãœãªã¥ãŒã·ã§ã³ãšåãæ°ã®ãœãªã¥ãŒã·ã§ã³ããããŸãã ãã®ãã¹ãŠãããã·ã¹ãã ã®çæ³ã®äžã§å
ã®ãã®ãããåçŽãªåºç€ãèŠã€ããããšãã§ããã°ãã·ã¹ãã èªäœã解ãã¿ã¹ã¯ã¯åçŽåãããããšã«ãªããŸãã
éæ³ã®ããã«ããã®ãããªåºç€ãååšããŸã-ããã¯çæ³ã®ã°ã¬ãããŒåºç€ãšåŒã°ããŸãã å®çŸ©äžãããã¯ãçæ³ããã®å€é
åŒã®å°äœïŒåŸã§ïŒã䜿çšããé€ç®æé ããŒãå°äœãçæãããããªåºç€ã§ãã ãããæ§ç¯ãããšããã®å€é
åŒã®1ã€ã¯ãå°ãªããšãã»ãšãã©ã®å Žåã1ã€ã®å€æ°ã®ã¿ã«äŸåããé次眮æã«ãã£ãŠã·ã¹ãã å
šäœã解ãããšãã§ããŸãã
æåŸã«å¿
èŠãªã®ã¯
å€é
åŒãšåºæº
ãããããŒã¬ãŒã®ã«ããã«ã åé
åŒã泚æãããè¯ããæ¹æ³ãéžæãïŒè©³çŽ°ã«ã€ããŠã¯æ¬ãåç
§ããŠãã ããïŒã
å€é
åŒã®äžäœé
ïŒãã®é åºä»ãã«é¢é£ïŒ
ããããŠ
-åé
åŒã®æå°å
¬åæ°
ãããŠ
ã ãããã
-ããã®å€é
åŒ
ãããŠ
次ã®æ§é ãåŒã³åºãããŸãã
å®èšŒæžã¿ïŒåºæº
-pairïŒçæ³ã®åºç€ã¯ããã®å Žåã«ã®ã¿ãã°ã¬ãããŒã®åºç€ã§ãã
-ãã®ã¡ã³ããŒã®ä»»æã®ãã¢ããã®å€é
åŒã¯ãåºåºã§é€ç®ãããšãã«0ã®å°äœãäžããŸãïŒããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãïŒã ããã«ããããã®ãããªåºç€ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã ãçŽã¡ã«æ±ããããŸãã
- åºåºå€é
åŒã®åãã¢ã«ã€ããŠãããããæ§æããŸã -å€é
åŒã§ããããåºã«å°äœã§é€ç®ããŸãã
- ãã¹ãŠã®å°äœããŒãã«çããå Žåãã°ã¬ãããŒåºåºãååŸãããŸãã ããã§ãªãå Žåã¯ããŒã以å€ã®ãã¹ãŠã®æ®å·®ãåºåºã«è¿œå ããæé 1ã«æ»ããŸãã
ãããBuchbergerã¢ã«ãŽãªãºã ã§ã-ãã®èšäºã®äž»èŠãªäž»é¡ã§ãã ããã¯ãã¹ãŠæ°åŠã§ãå
ã«é²ãããšãã§ããŸãã äœããç解ããŠããªãå Žåã¯ããŠã£ãããã£ã¢ãŸãã¯æ¬ãã芧ãã ããããã ããããã«ãã¬ãŒã·ã§ã³ãè¡ãã«ã¯é«ç代æ°ã®ç¥èã¯å¿
èŠãããŸããã
2 Haskellã®ããã€ãã®å€æ°ããã®å€é
åŒã®è¡šçŸ
åé
åŒããå€é
åŒã®è¡šçŸãæ§ç¯ãå§ããŸãã åé
åŒã®ç¹åŸŽã¯ãä¿æ°ãšå€æ°ã®æ¬¡æ°ã®2ã€ã ãã§ãã å€æ°ããããšä»®å®ããŸã
ã
ãªã©ãªã©ã ãã®åŸãåé
åŒ
ä¿æ°ã¯1ããã³åºŠ
[2,3,1]
ã§ãåé
åŒ
-ä¿æ°2ããã³æ¬¡æ°
[0,0,3]
ã ãŒã床ã«æ³šæããŠãã ããïŒ ãããã¯ãä»ã®ãã¹ãŠã®ã¡ãœããã®å®è£
ã«äžå¯æ¬ ã§ãã äžè¬ã«ãïŒ1ã€ã®åé¡ã®æ çµã¿å
ã§ïŒãã¹ãŠã®åé
åŒã®æ¬¡æ°ã®ãªã¹ãã¯åãé·ãã§ããå¿
èŠããããŸãã ããã«ãããäœæ¥ã倧å¹
ã«ç°¡çŽ åãããŸãã
ãåé
ãåããä¿æ°ïŒåã
c
ãïŒãšåºŠæ°ã®ãªã¹ãïŒååã
a
ãïŒã§æ§æããã代æ°ããŒã¿åãšããŠèª¬æããŸãããã
data Monom ca = M c [a] deriving (Eq)
åé
åŒãäºãã«æ¯èŒããå¿
èŠãããããã
Ord
ã¯ã©ã¹ã®å
·äœäŸãäœæããŸãã ããã¯éåžžã«åçŽã§ãããšåæã«ãåé
åŒã®ãé©åãªãé åºä»ãã®èŠåã«æºæ ããŠãããããéåžžã®èŸæžåŒé åºä»ãã䜿çšããŸãã ãŸããã·ã¹ãã ã§ã®äœæ¥ã®äŸ¿å®äžã
Show
ã¯ã©ã¹ã®å
·äœäŸãäœæããŸãã
instance (Eq c, Ord a) => Ord (Monom ca) where compare (M _ asl) (M _ asr) = compare asl asr instance (Show a, Show c, Num a, Num c, Eq a, Eq c) => Show (Monom ca) where show (M c as) = (if c == 1 then "" else show c) ++ (intercalate "*" $ map showOne $ (filter (\(p,_) -> p /= 0) $ zip as [1..])) where showOne (p,i) = "x" ++ (show i) ++ (if p == 1 then "" else "^" ++ (show p))
show
é¢æ°ã¯ã¹ããŒãã«ããããšããŸãã1ã®å Žåã¯ä¿æ°ã衚瀺ããããŒã次ã®å€æ°ã衚瀺ãããå€æ°ã®æåã®æ¬¡æ°ã衚瀺ããŸããã ãã®ããã«ïŒ
*Main> M 2 [0,1] 2x2 *Main> M 1 [2,2] x1^2*x2^2
show
䌌ãé¢æ°ãäœæããã®ã§ããããã©ã®ããã«æ©èœããããæ£ç¢ºã«èª¬æãã䟡å€ããããŸãã
zip as [1..]
䜿çšããŠãå次æ°ããã®å€æ°ã®æ°ã§ã次ã«
filter (
(p _) -> p /= 0)
filter (
(p _) -> p /= 0)
filter (
(p _) -> p /= 0)
0床ã
showOne
ã
showOne
ããŠåå€æ°ã®èª¬æãæååã«
showOne
æåŸã«
Data.List
intercalate
ã䜿çšããŠãä¹ç®ã¢ã€ã³ã³ãæ£åšãããŠãã¹ãŠãæ¥çããŸã
ããã§ãå®éã®ã¿ã€ãã®å€é
åŒã説æããæºåãã§ããŸããã ããã«ã¯ãéåžžã®ãªã¹ãã«å¯Ÿãã
newtype
ã©ãããŒãé©ããŠããŸãã
newtype Polynom ca = P [Monom ca] deriving (Eq) instance (Show a, Show c, Num a, Num c, Eq a, Eq c) => Show (Polynom ca) where show (P ms) = intercalate " + " $ map show ms
ä»åã¯ããã¹ãŠã®æ±ãäœæ¥ããã§ã«åé
åŒã®ã¿ã€ãã«é ãããŠããããã
show
é¢æ°ã¯åçŽã§ãã 次ã®ããã«æ©èœããŸãã
*Main> P [M 1 [3,1], M 1 [2,2], M 1 [1,1]] x1^3*x2 + x1^2*x2^2 + x1*x2
å°æ¥çã«ã¯ããã®ãªã¹ãã®åé
åŒã¯åžžã«éé ã§æ ŒçŽãããããšã«åæããŸãïŒ
Ord
ã®å®æœåœ¢æ
ã®å®çŸ©ã®æå³ã§ïŒã ããã«ãããããã€ãã®å®è£
ãç°¡åã«ãªããŸãã
3å€é
åŒã®æäœ
æãåçŽãªæäœã¯LTããŒããšçãããã©ããã®ãã¹ããããã³æ°å€ã®ä¹ç®ã§ãã åé
åŒã®é åºã«é¢ããåæãããæãå€ãåé
åŒã¯åžžã«ãªã¹ãã®æåã«æ¥ãŠã
head
ã䜿çšããŠååŸã§ããããšãããããŸãã åé
åŒã¯ãä¿æ°ããŒãã®å Žåã¯ãŒããšèŠãªãããåé
åŒãå«ãŸãªãå Žåã¯å€é
åŒãšèŠãªãããŸãã ãŸããå®æ°ãæãããšä¿æ°ãå€ããã ãã§ãïŒ
lt :: Polynom ca -> Monom ca lt (P as) = head as zero :: (Num c, Eq c) => Monom ca -> Bool zero (M c _) = c == 0 zeroP :: Polynom ca -> Bool zeroP (P as) = null as scale :: (Num c) => c -> Monom ca -> Monom ca scale c' (M c as) = M (c*c') as
2ã€ã®åé
åŒã¯ãä¿æ°ã®ã¿ãç°ãªãå Žåã«é¡äŒŒãšåŒã°ããŸãã ãããã«ã€ããŠã¯ãéã決å®ãããŸã-ä¿æ°ãè¿œå ããã ãã§ã次æ°ã¯å€æŽãããŸããã
similar :: (Eq a) => Monom ca -> Monom ca -> Bool similar (M _ asl) (M _ asr) = asl == asr addSimilar :: (Num c) => Monom ca -> Monom ca -> Monom ca addSimilar (M cl as) (M cr _) = M (cl+cr) as
2ã€ã®åé
åŒãä¹ç®ããã«ã¯ãåå€æ°ã®æ¬¡æ°ãå ç®ããã ãã§ãã ãã®æäœã¯ãåªãã
zipWith
é¢æ°ã䜿çšããŠéåžžã«ç°¡åã«å®è£
zipWith
ãŸãã ã³ãŒãã¯ããèªäœãç©èªã£ãŠãããšæããŸãïŒ
mulMono :: (Num a, Num c) => Monom ca -> Monom ca -> Monom ca mulMono (M cl asl) (M cr asr) = M (cl*cr) (zipWith (+) asl asr)
ããã«èå³æ·±ãã®ã¯ãå€é
åŒã®è¿œå ã§ãã ãã®åé¡ãååž°çã«è§£æ±ºããŸãã èªæãªã±ãŒã¹-2ã€ã®ãŒãå€é
åŒïŒç©ºã®ãªã¹ãïŒã®åèšã¯ããŒãå€é
åŒã«çããã å€é
åŒãšãŒãã®åèšã¯ããã«çãããªããŸãã ããã§ãäž¡æ¹ã®å€é
åŒãéãŒããšèŠãªãããšãã§ããŸããã€ãŸããåå€é
åŒãäžäœã®é
ãšæ®ãã®ãããŒã«ãã«åããããšãã§ããŸãã 次ã®2ã€ã®å ŽåããããŸãã
- ã·ãã¢ã¡ã³ããŒãåæ§ã§ãã ãã®å Žåãããããè¿œå ããçµæïŒãŒã以å€ã®å ŽåïŒãããŒã«ã®åèšã«è¿œå ããŸãã
- ã·ãã¢ã¡ã³ããŒã¯äŒŒãŠããŸããã 次ã«ã倧ããæ¹ãéžæããŸãã é åºä»ãæ¡ä»¶ã¯ãäž¡æ¹ã®å€é
åŒã®è£Ÿã«åæ§ã®åé
åŒããªãããšãä¿èšŒããŸãã ãããã£ãŠãéžæããå€é
åŒã®ããŒã«ãå¥ã®å€é
åŒã§æãç³ã¿ããã®æ倧ã®åé
åŒãæåã«è¿œå ã§ããŸãã
ãã®ååž°çãªæé ã®çµæãšããŠãåã³é åºä»ãå€é
åŒãååŸããã³ãŒãèªäœãèšè¿°ããããšã«æ³šæããŠãã ããã
addPoly :: (Eq a, Eq c, Num c, Ord a) => Polynom ca -> Polynom ca -> Polynom ca addPoly (P l) (P r) = P $ go lr where go [] [] = [] go as [] = as go [] bs = bs go (a:as) (b:bs) = if similar ab then if (zero $ addSimilar ab) then go as bs else (addSimilar ab):(go as bs) else if a > b then a:(go as (b:bs)) else b:(go (a:as) bs)
å€é
åŒã®ä¹ç®ã¯ãå®å
šã«èªç¶ãªæ¹æ³ã§ååŸãããŸãã åé
åŒã«å€é
åŒãæããã®ã¯éåžžã«ç°¡åã§ã
mulMono
ãš
mulMono
ã䜿çšããŠåé
åŒã®ããããã«æããŸãã 次ã«ã2ã€ã®å€é
åŒã®ç©ã«ååžïŒãååžåããæ¬åŒ§ã®é瀺ïŒãé©çšããæåã®å€é
åŒã®ãã¹ãŠã®åé
åŒã«2çªç®ã®å€é
åŒãä¹ç®ããŠçµæãå ç®ããã ãã§ããããšãããããŸãã åã
map
ã䜿çšããŠä¹ç®ãè¡ãã
addPoly
foldl'
ããã³
addPoly
ã䜿çšã
foldl'
çµæã
foldl'
ãŸãã ããã2ã€ã®æäœã®ã³ãŒãã¯é©ãã»ã©çããåã®èª¬æãããçãã§ãïŒ
mulPM :: (Ord a, Eq c, Num a, Num c) => Polynom ca -> Monom ca -> Polynom ca mulPM (P as) m = P $ map (mulMono m) as mulM :: (Eq c, Num c, Num a, Ord a) => Polynom ca -> Polynom ca -> Polynom ca mulM l@(P ml) r@(P mr) = foldl' addPoly (P []) $ map (mulPM r) ml
ããã§ãã¹ãŠãå€é
åŒã«åºæ¬çãªã¢ã¯ã·ã§ã³ãå®è£
ããã®ã§ãå
ã«é²ãããšãã§ããŸãïŒ
4å°äœã«åºã¥ãé€ç®ïŒåæžïŒ
åé
åŒãšèšã
åé
åŒã§
é€ç® ãã®ãããªåé
åŒãååšããå Žå
ãã
ã æããã«ãããã¯åå€æ°ã
å£ãã
ã ãããã£ãŠããã§ã«ããªãã¿ã®
zipWith
é¢æ°ãšãçŽ æŽããã
and
é¢æ°ã䜿çšããŠãåå²å¯èœæ§ãã§ãã¯ãå®è£
ã§ããŸãã æ€èšŒã«å ããŠãå®éã®åå²æé ãç°¡åã«ååŸã§ããŸãã
dividable :: (Ord a) => Monom ca -> Monom ca -> Bool dividable (M _ al) (M _ ar) = and $ zipWith (>=) al ar divideM :: (Fractional c, Num a) => Monom ca -> Monom ca -> Monom ca divideM (M cl al) (M cr ar) = M (cl/cr) (zipWith (-) al ar)
ä¿æ°ã¿ã€ãã¯é€ç®ãèš±å¯ããå¿
èŠãããããšã«æ³šæããŠãã ãã
Fractional
ã¯ã©ã¹ã æ鬱ã§ãããäœãã§ããŸããã
å€é
åŒãå°äœã®ããåºåºã«åå²ããã¢ã«ãŽãªãºã ã¯ãåºæ¬çã«åã«ããåçŽãªåŠæ ¡ã®åå²ã§ãã åºåºã®å€é
åŒã®äžã§ãæåã®å€é
åŒã¯ãé
åœã®äžäœé
ãäžäœã¡ã³ããŒã§é€ç®ãããããã«éžæããããã®å€é
åŒã«äžäœã¡ã³ããŒã®åãæãããã®ãé
åœããå·®ãåŒãããŸãã æžç®ã®çµæã¯æ°ããé
åœãšããŠååŸãããããã»ã¹ãç¹°ãè¿ãããŸãã ã·ãã¢ã¡ã³ããŒãããŒã·ã¹ã®ã·ãã¢ã¡ã³ããŒã®ãããã§ãå²ãåããªãå Žåãéšéã¯å®äºããæåŸã®é
åœã¯å°äœãšåŒã°ããŸãã
äž»ãªé€ç®æé ã
reduceMany
ãšåŒã³ãŸããã
reducable
ãš
reduce
2ã€ã®è£å©çãªãã®ãå¿
èŠã§ãã æåã®é¢æ°ã¯ãå€é
åŒãå¥ã®æŽæ°ã§å²ãåãããã©ããããã§ãã¯ãã2çªç®ã®é¢æ°ã¯é€ç®ãå®è¡ããŸãã
reducable :: (Ord a) => Polynom ca -> Polynom ca -> Bool reducable lr = dividable (lt l) (lt r) reduce :: (Eq c, Fractional c, Num a, Ord a) => Polynom ca -> Polynom ca -> Polynom ca reduce lr = addPoly lr' where r' = mulPM r (scale (-1) q) q = divideM (lt l) (lt r)
æžç®ããé¢æ°ããªãããã2çªç®ã®å€é
åŒã«-1ãæããŠå ç®ããã ãã§ã-ç°¡åã§ãïŒ ãããŠããããé€ç®ã¢ã«ãŽãªãºã å
šäœã§ãã
reduceMany :: (Eq c, Fractional c, Num a, Ord a) => Polynom ca -> [Polynom ca] -> Polynom ca reduceMany h fs = if reduced then reduceMany h' fs else h' where (h', reduced) = reduceStep h fs False reduceStep h (f:fs) r | zeroP h = (h, r) | otherwise = if reducable hf then (reduce hf, True) else reduceStep h fs r reduceStep h [] r = (h, r)
reduceMany
é¢æ°ã¯ãå€é
åŒãåºåºã«åå²ããããšããŸãã åå²ãçºçããå Žåãããã»ã¹ã¯ç¶è¡ãããã以å€ã®å Žåã¯çµäºããŸãã å
éšé¢æ°
reduceStep
ã¯ãé€ç®ã§ããæåã®å€é
åŒãæ¢ããŠé€ç®ããå°äœãšé€ç®ãè¡ããããã©ããã瀺ããã©ã°ãè¿ããŸãã
5 Buchbergerã¢ã«ãŽãªãºã
ããã§ããã®èšäºã®äž»èŠéšåã§ããããããã«ã¬ãŒã¢ã«ãŽãªãºã ã®å®è£
ã«ã€ããŠèª¬æããŸãã ãŸã æã£ãŠããªãå¯äžã®ãã®ã¯ãååŸããããã®é¢æ°ã§ã
-å€é
åŒã ãã®å®è£
ã¯éåžžã«ã·ã³ãã«ã§ãåé
åŒã®æå°å
¬åæ°ãèŠã€ããããã®è£å©é¢æ°ã§ãã
lcmM :: (Num c, Ord a) => Monom ca -> Monom ca -> Monom ca lcmM (M cl al) (M cr ar) = M (cl*cr) (zipWith max al ar) makeSPoly :: (Eq c, Fractional c, Num a, Ord a) => Polynom ca -> Polynom ca -> Polynom ca makeSPoly lr = addPoly l' r' where l' = mulPM l ra r' = mulPM r la lcm = lcmM (lt l) (lt r) ra = divideM lcm (lt l) la = scale (-1) $ divideM lcm (lt r)
ããã§ã¯ãäž¡æ¹ã®å€é
åŒã«å¯Ÿå¿ããåé
åŒãä¹ç®ãããæ®ãã®é€ç®ã®å Žåã®ããã«ã2çªç®ã®å€é
åŒã«ã1ããã€ãã¹ãããŸãã
ãã®ã¢ã«ãŽãªãºã ãå®è£
ããæ¹æ³ã¯ãããããããšç¢ºä¿¡ããŠããŸãã ãŸããå®è£
ãæé©ã§ãããšããååã«åçŽã§ãããšãããµããããŸããã ããããç§ã¯ããã奜ãã§ããããæ©èœããããããã¹ãŠã§ãã
ç§ã䜿çšããã¢ãããŒãã¯ãåçãšåŒã¶ããšãã§ããŸãã åºç€ã2ã€ã®éšåã«åå²ããŸã-ãã§ã«ãã§ãã¯ïŒããã³è¿œå ïŒããŠããéšå
-ãã¹ãŠã®ãã¢ã®å€é
åŒ-ã
checked
ã-ãããè¡ãå¿
èŠãããã®ã¯ã
add
ã ã¢ã«ãŽãªãºã ã®1ã€ã®ã¹ãããã¯æ¬¡ã®ããã«ãªããŸãã
- 2çªç®ã®éšåããæåã®å€é
åŒãåã
- äžè²«ããŠæ§ç¯ãã -ãããšæåã®éšåã®ãã¹ãŠã®å€é
åŒãšã®éã®å€é
åŒãããã³ãã¹ãŠã®éãŒãã®å°äœã2çªç®ã®éšåã®æåŸã«è¿œå
- ãã®å€é
åŒãæåã®éšåã«ç§»åããŸã
2çªç®ã®éšåã空ã«ãªããšããã«ãæåã®éšåã«ã°ã¬ãããŒåºåºãå«ãŸããŸãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®å©ç¹ã¯ãããããèæ
®ãããªãããšã§ã
-æ¢ã«ã«ãŠã³ãããã³ãã§ãã¯ãããŠãããã¢ããã®å€é
åŒã ãã®ããã»ã¹ã®éèŠãªæ©èœã¯
checkOne
ã§ãã å€é
åŒïŒ2çªç®ã®éšåããïŒãšäž¡æ¹ã®éšåãåããåºåºã«è¿œå ããå¿
èŠãããå€é
åŒã®ãªã¹ããè¿ããŸãã æåã®éšåã§åçŽãªååž°ã䜿çšããŸããåœç¶ããŒãã®æ®åºãè¿œå ããŸããã
checkOne :: (Eq c, Fractional c, Num a, Ord a) => Polynom ca -> [Polynom ca] -> [Polynom ca] -> [Polynom ca] checkOne f checked@(c:cs) add = if zeroP s then checkOne f cs add else s:(checkOne f cs (add ++ [s])) where s = reduceMany (makeSPoly fc) (checked++add) checkOne _ [] _ = []
確ãã«ããã¯ããªãããŒãª
foldl
眮ãæããããšãã§ããŸãããããã¯æŒç¿ãšããŠæ®ããŠãããŸãã ããã«åºã¥ããŠã°ã¬ãããŒåºåºãæ§ç¯ããããšã ããæ®ã£ãŠããŸãã ã¢ã«ãŽãªãºã ã¹ãããã®å®è£
ã¯ããã®èª¬æãéèªçã«ç¹°ãè¿ããŸãããèªèº«ã§ç¢ºèªããŠãã ããã
build checked add@(a:as) = build (checked ++ [a]) (as ++ (checkOne a checked add)) build checked [] = checked
å€é
åŒ
a
ã¯æåã®éšåã«é²ã¿ããã®ãŒã以å€ã®ãã¹ãŠã®æ®åºã2çªç®ã«ãªããŸãã 確èªããã ãã§ååã§ãã
-2çªç®ã®éšåã®åå€é
åŒã®å€é
åŒãæåã®éšåã®ã¿ã§ãéšåéã®å€é
åŒã®åãã«ããã ããããã°ã¬ãããŒåºåºãååŸããã«ã¯ãå€é
åŒã®1ã€ãæåã®éšåã«ãæ®ãã2çªç®ã«å
¥ãã
makeGroebner
é¢æ°ã§è¡ããã
build
æé ãé©çšããã ãã§ååã§ããããšã«æ³šæããŠãã ããã
makeGroebner :: (Eq c, Fractional c, Num a, Ord a) => [Polynom ca] -> [Polynom ca] makeGroebner (b:bs) = build [b] bs where build checked add@(a:as) = build (checked ++ [a]) (as ++ (checkOne a checked add)) build checked [] = checked
6䜿çšäŸ
ãããã®ãã¹ãŠã®çè«çæ§é ã¯ããããã®æ¹æ³ã®å®çšçãªå¿çšãå®èšŒããããšãªããå®å
šã«åœ¹ã«ç«ããªãããã§ãã äŸãšããŠã3ã€ã®åã®äº€ç¹ãèŠã€ããåé¡ãèããŠã¿ãŸããããããã¯ãå°å³äžã§ã®æãç°¡åãªäœçœ®æ±ºãã§ãã åã®æ¹çšåŒãæ¹çšåŒç³»ãšããŠèšè¿°ããŸãã
ã
è§ãã£ããéããšã次ã®çµæãåŸãããŸãã
ã°ã¬ãããŒåºåºãæ§ç¯ããŸãããïŒããæ£ç¢ºã«ããããã«
Rational
ã¿ã€ãã䜿çšããŸããïŒïŒ
*Main> let f1 = P [M 1 [2,0], M (-2) [1,0], M 1 [0,2], M (-26) [0,1], M 70 [0,0]] :: Polynom Rational Int *Main> let f2 = P [M 1 [2,0], M (-22) [1,0], M 1 [0,2], M (-16) [0,1], M 160 [0,0]] :: Polynom Rational Int *Main> let f3 = P [M 1 [2,0], M (-20) [1,0], M 1 [0,2], M (-2) [0,1], M 76 [0,0]] :: Polynom Rational Int *Main> putStr $ unlines $ map show $ makeGroebner [f1,f2,f3] x1^2 + (-2) % 1x1 + x2^2 + (-26) % 1x2 + 70 % 1 x1^2 + (-22) % 1x1 + x2^2 + (-16) % 1x2 + 160 % 1 x1^2 + (-20) % 1x1 + x2^2 + (-2) % 1x2 + 76 % 1 (-20) % 1x1 + 10 % 1x2 + 90 % 1 15 % 1x2 + (-75) % 1
å¥è·¡çã«ãããã«çããåºã2ã€ã®ç·åœ¢æ¹çšåŒããã€ã³ãïŒ7.5ïŒãåŸãããŸããã 3ã€ã®åãã¹ãŠã«ããããšã確èªã§ããŸãã ãã®ããã3ã€ã®è€éãª2次æ¹çšåŒã®ã·ã¹ãã ã®è§£ã2ã€ã®åçŽãªç·åœ¢æ¹çšåŒã«æžãããŸããã GröbnerããŒã¹ã¯ããã®ãããªã¿ã¹ã¯ã«éåžžã«äŸ¿å©ãªããŒã«ã§ãã
7èå¯ãšçµè«ã«é¢ãã質å
å®éããã®çµæã¯ããã«æ¹åã§ããŸãã
-å€é
åŒã¯ãäžçŽã¡ã³ããŒãäºãã«çŽ ã§ãªãå€é
åŒã®ãã¢ã«å¯ŸããŠã®ã¿èæ
®ãããå¿
èŠããããŸããã€ãŸããæå°å
¬åæ°ã¯åãªãç©ã§ã¯ãããŸããã äžéšã®æ
å ±æºã¯ããã®ã±ãŒã¹ã«ã€ããŠãå€é
åŒã«ã¯
ãªã³ã¯ãããããšèšã£ãŠããŸãã ãã®æé©åã
makeGroebner
é¢æ°ã«è¿œå ããŸãã
äžäœé
ãåºåºã®ä»ã®å€é
åŒã®äžäœé
ã§é€ç®ãããå€é
åŒãæçµåºåºã«è©²åœããå Žåãé€å€ã§ããŸãã ãã®ãããªãã¹ãŠã®å€é
åŒãé€å€ããåŸã«åŸãããåºåºã¯ã
æå°ã°ã¬ãããŒåºåºãšåŒã°ããŸãã ãŸãã
ä»»æã®é
ãä»ã®å€é
åŒã®äžäœé
ã§é€ç®ãããå€é
åŒãèæ
®ããããšãã§ããŸãã ãã®å Žåããã®å€é
åŒãå¥ã®é€ç®ã®å°äœã§çœ®ãæããŸãã ãã®ã¿ã€ãã®ãã¹ãŠã®å¯èœãªæäœãå®è¡ãããåºç€ã¯ã
reduceãšåŒã°
ããŸãã æŒç¿ãšããŠãããŒã¹ã®æå°åãšåæžãå®æœããŸãã
çµè«ãšããŠããã®èšäºãæåŸãŸã§èªãã§ããããã¹ãŠã®äººã«æè¬ããããšæããŸãã ç§ã®è©±ã¯å€å°é¢åã§ãããã³ãŒãã¯äžå®å
šã§ãã£ãïŒãããŠç解ã§ããªããããããªãïŒããšã¯ç¥ã£ãŠããŸãããGrobnerã®ããŒã¹ã«èª°ããèå³ãæã£ãŠããããšãæã¿ãŸãã å°ãªããšãããã€ãã®å®éã®ã¿ã¹ã¯ã§ç§ã®ææã®ã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããšãã§ããã°ãç§ã¯éåžžã«åãã§ããŸãã
ãã®èšäºã®ã³ãŒãã¯ãã¹ãŠ
gistãšããŠå
¥æã§ããŸãã