%% kxx/oxasir.sm1 1998, 2/12 (this version is at Old/oxasir.sm1.19980212 %% 3/1, 1995, 11/5, 11/21 %% This file is error clean. %%%%%%% How to install. %%% Set ASIR_LIBDIR if necessary. Ex. /u/nobuki/lib/asir %%% write ~/.asirrc : load("gr")$ load("primdec")$ end$ %%% oxasir.asir must be in %%% LOAD_SM1_PATH or oxasirpath.asirlib %%% Edit below %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% /usr/local/lib/sm1, SM1_LOAD_PATH, /usr/local/lib/asir, ASIR_LOAD_PATH /oxasirpath.oxasir (ox_asir) def %% loadmethod is 1 /oxasirpath.asirlib (oxasir.asir) def /ox_asirConnectMethod { asirconnectr /oxasir.ccc set } def %/ox_asirConnectMethod { asirconnect2 } def %% Old path %/oxasirpath.oxasir (/home/nobuki/kxx/ox_asir) def %% loadmethod is 1 %/oxasirpath.asirlib (/home/nobuki/kxx/oxasir.asir) def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /oxasir.loadmethod 1 def %% "..." oxsendcmo (load) ox... %/oxasir.loadmethod 0 def %% load("..."); %% at MSRI %%%%%%%%%%%%%%%% end of configuration. /initializePathNamesForOxAsir { [oxasirpath.oxasir] getPathNameAsir /oxasirpath.oxasir set [oxasirpath.asirlib] getPathNameSm1 /oxasirpath.asirlib set } def /oxasir.verbose 0 def /oxasir.version (2.981105) def oxasir.version [(Version)] system_variable gt { [(This package requires the latest version of kan/sm1) nl (Please get it from http://www.math.kobe-u.ac.jp/KAN) ] cat error } { } ifelse (oxasir.sm1, --- open asir protocol module 3/1 1998, 6/5 1999) message-quiet ( asirconnect, asir, fctr, primadec, (C) M.Noro, N.Takayama ) message-quiet /oxasir.ccc load isArray { } { /oxasir.ccc [ ] def } ifelse [(parse) (ox.sm1) pushfile] extension pop oxasir.verbose { (type in asirconnect to connect, asir is used to execute asir command. ) message (type in asirconnect2 to open a new window for ox_asir, connect, asir is used to execute asir command [you need to edit asirconnect2 to tell the path to load ox_asir] ) message } { } ifelse /loadAsirFile { /arg1 set [/in-loadAsirFile /peer /fname] pushVariables [ /peer arg1 0 get def /fname arg1 1 get def oxasir.loadmethod { peer fname oxsendcmo peer 1 oxsendcmo peer (load) oxexec }{ peer [$load("$ fname $");$] cat oxsubmit }ifelse ] pop popVariables } def [(loadAsirFile) [$[client fname] loadAsirFile (ox_asir function)$ $Load a file into the client$ ]] putUsages /asirinit { %% gr and primdec are loaded by .asirrc /asirinit.peer set [asirinit.peer oxasirpath.asirlib] loadAsirFile } def /asirconnect { [(localhost) 1300 1200] oxconnect /oxasir.ccc set /ccc oxasir.ccc def %% for compatibility. oxasir.ccc asirinit } def /asirconnect2 { [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxasirpath.oxasir oxpath.null ( & )] cat system % (xterm -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_asir &) system % (kterm -iconic -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_asir &) system % For MSRI % Eterm is also nice (including kanji). rxvt is also nice. %(xterm -icon -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_asir2 &) system %(kterm2 -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_asir2 &) system % (If you start the server automatically, you may have a trouble to) message % (oxreset. In order to avoid this trouble, start the server by hand.) message (sleep 5) system [(localhost) 1300 1200] oxconnect /oxasir.ccc set /ccc oxasir.ccc def %% for compatibility. oxasir.ccc asirinit } def [(asirconnect2) [(asirconnect2 starts ox_asir server. (ox_asir function)) (Open xxx protocol is used for the communication between sm1 and ox_asir.) (cf. oxhelp, asir.) (You need to install ox_asir server to use this function. cf. oxasir) ]] putUsages /asirconnect3 { [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxasirpath.oxasir ( -data 2300 -control 2200) oxpath.null ( & )] cat system % (If you start the server automatically, you may have a trouble to) message % (oxreset. In order to avoid this trouble, start the server by hand.) message (sleep 5) system [(localhost) 2300 2200] oxconnect /oxasir.ccc2 set /ccc2 oxasir.ccc2 def %% for compatibility. oxasir.ccc2 asirinit (The client is stored in oxasir.ccc2.) message } def [(asir) [(pid [asir-command, asir-arg1, asir-arg2, ...] asir result (ox_asir function)) (Call open asir server. You need to install ox_asir on your system) (to use this function. cf. primadec, fctr, asirconnect2, asirconnectr.) (If you interrupted the computation by typing ctrl-C, type in ) ( oxasir.ccc oxreset ; ) (to interrupt the ox_asir server.) (Example: oxasir.ccc [(fctr) (x^10-1).] asir ) ( ) (This function requires plugins cmo, socket and ox_asir server. cf. oxasir) (See, ftp://endeavor.fujitsu.co.jp/pub/isis/asir on asir) ] ] putUsages /asir { /arg2 set /arg1 set [/pid /asir-comm /comm /n /i /rr] pushVariables [(CurrentRingp)] pushEnv [ /pid arg1 def /asir-comm arg2 def pid tag 6 eq { } { (Invalid pid. See asir.) error } ifelse pid 0 get (client) eq { } { (Invalid pid. See asir.) error } ifelse asir-comm tag 6 eq { } { (Invalid argument asir-comm. See asir) error } ifelse [ %% Change the current ring if necessary to send a correct OxVlist. asir-comm oxasir.changeRing ] pop %%% Setting OxVlist to tell asir a way to change dist-poly <==> poly. (OxVlist=) getVlist2 toString (;) 3 cat_n /comm set %% comm message pid comm oxsubmit pid (print(OxVlist);) oxsubmit /n asir-comm length def n 1 sub -1 1 { /i set pid asir-comm i get oxsendcmo pid 1 oxsendcmo pid (ox_dtop) oxexec } for pid n 1 sub oxsendcmo pid asir-comm 0 get oxexec pid 1 oxsendcmo pid (ox_ptod) oxexec pid oxpopcmo /arg1 set ] pop popEnv popVariables arg1 } def /oxasir.changeRing { /arg1 set [/in-oxasir.changeRing /f /rr] pushVariables [ /f arg1 def f isArray { f {oxasir.changeRing} map }{ f isPolynomial { f (0). eq { } { f (ring) dc /rr set [(CurrentRingp) rr] system_variable } ifelse } { } ifelse } ifelse ] pop popVariables } def /fctr { /arg1 set [/f /comm /vv] pushVariables [(CurrentRingp)] pushEnv [ /f arg1 def oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse f isPolynomial not { /vv f 1 get def vv isArray { /vv vv from_records def } { } ifelse /f f 0 get def [vv ring_of_polynomials 0] define_ring f . /f set }{ } ifelse oxasir.ccc [(fctr) f] asir /arg1 set ] pop popEnv popVariables arg1 } def [(fctr) [(You need to install ox_asir server to use this function. (ox_asir function)) (f fctr g) (poly f; array g;) ([f v] fctr g ; string f, string or array of string v) (This function factors the polynomial f over Q.) ( ) (Example 1: [(x^10-y^10) (x,y)] fctr ::) (Example 2: (x^10-1). fctr ::) ( ) (If you interrupted the computation by typing ctrl-C, type in ) ( oxasir.ccc oxreset ; ) (to interrupt the ox_asir server.) ( ) (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) ]] putUsages [(primadec) [(You need to install ox_asir server to use this function. (ox_asir function)) ([ ii ] primadec [[q1 p1] [q2 p2] ... ] ) ( array of poly ii; array of poly q1, p1, q2, p2 ...;) ( q1, q2, ... are primary components of the primary ideal decomposition) ( of the ideal generated by << ii >>.) ( ) ([ ii v ] primadec [[q1 p1] [q2 p2] ... ] ) ( array of poly or string ii; array of string v; array of poly q1, p1, q2, p2 ...;) (<< v >> is an array of independent variables.) ( ) ([ ii v ] primadec [[q1 p1] [q2 p2] ... ] ) ( array of poly or string ii; array of string v; array of poly q1, p1, q2, p2 ...;) ( v is a string of variables separated by , ) ( ) (Example: [(x,y) ring_of_polynomials 0] define_ring) ( [ [(x^2-1). (x y).] ] primadec pmat ;) ( ) (Example: [ [(x^2-1) (x y)] [(x) (y)]] primadec pmat ;) ( ) (If you interrupted the computation by typing ctrl-C, type in ) ( oxasir.ccc oxreset ; ) (to interrupt the ox_asir server.) ( ) (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) ]] putUsages /primadec { /arg1 set [/in-primadec /aa /f /comm /vvv /r /setarg] pushVariables [(CurrentRingp)] pushEnv [ /aa arg1 def aa isArray { } { (<> primadec) error } ifelse /setarg 0 def oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse aa { tag } map /typev set typev [ ArrayP ] eq { /f aa 0 get def f 0 get (ring) dc /r set [(CurrentRingp) r] system_variable /vvv getVariableNames def /setarg 1 def } { } ifelse typev [ArrayP StringP] eq { /f aa 0 get def /vvv [ aa 1 get to_records pop ] def /setarg 1 def } { } ifelse typev [ArrayP ArrayP] eq { /f aa 0 get def /vvv aa 1 get {toString} map def /setarg 1 def } { } ifelse setarg { } { (primadec : Argument mismatch) error } ifelse f 0 get isPolynomial { /r f 0 get (ring) dc def /vvv vvv { r ,, } map def } { [vvv from_records ring_of_polynomials 0] define_ring f { toString . } map /f set vvv { . } map /vvv set } ifelse oxasir.ccc [(primadec) f vvv] asir /arg1 set ] pop popEnv popVariables arg1 } def /getVlist2 { [/n /i ] pushVariables [ /n [(N)] system_variable def [ 0 1 n 1 sub { /i set (x) i (dollar) dc 2 cat_n } for 0 1 n 1 sub { /i set (d) i (dollar) dc 2 cat_n } for ] /arg1 set ] pop popVariables arg1 } def %%%%%%%%%%%%%%%%%%% /getVlist { [/n /i ] pushVariables [ /n [(N)] system_variable def [ 0 1 n 1 sub { /i set [(x) (var) i] system_variable } for 0 1 n 1 sub { /i set [(D) (var) i] system_variable } for ] /arg1 set ] pop popVariables arg1 } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [(chattr) 0 /findIntegralRoots] extension pop oxasir.verbose { (Overloaded on findIntegralRoots.) message } { } ifelse /findIntegralRoots { /arg1 set [/in-findIntegralRoots /pp ] pushVariables [ /pp arg1 def oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse oxasir.ccc oxIsServerReady { pp findIntegralRoots.oxasir /arg1 set} { pp findIntegralRoots.slow /arg1 set} ifelse ] pop popVariables arg1 } def /findIntegralRoots.oxasir { /arg1 set [/in-findIntegralRoots /f /r /g /aa /rlist] pushVariables [(CurrentRingp) (KanGBmessage)] pushEnv [ /f arg1 def [(s) ring_of_polynomials 0] define_ring f toString . /f set f fctr rest /g set g { 0 get /aa set aa (s). degree 1 eq { aa (s). coeff 1 get /aa set aa length 1 eq { 0 } { aa 0 get (1). eq { 0 << aa 1 get (integer) dc >> sub } { } ifelse } ifelse }{ } ifelse } map /rlist set %% rlist :: [-1000000] rlist join shell rest /arg1 set ] pop popEnv popVariables arg1 } def %%%%%%%%%%%%%%%%%%%%%%%%%% /asirconnectr { [/in-asirconnectr /pass /peer /data /control /oxasir] pushVariables [ /pass [(oxGenPass)] extension def /peer [(oxGetPort) (localhost)] extension def /data peer 1 get toString def /control peer 3 get toString def peer message [oxpath.oxlog.xterm oxpath.ox ( -reverse -ox ) oxasirpath.oxasir ( -data ) data ( -control ) control ( -pass ) pass oxpath.null ( &)] cat system [(oxCreateClient2) peer 0 pass] extension /oxasir set %% 0 means connect from only localhost. oxasir asirinit /arg1 oxasir def ] pop popVariables arg1 } def [(asirconnectr) [(asirconnectr server (ox_asir function)) (array server;) (Example: asirconnectr /oxasir.ccc set) ]] putUsages %%%%%%%%%%%%% From gbhg3/Int/intw.sm1 %% This function needs solv1.asir and ox_asir. %% See solv1.asir for the usage of this function. /rationalRoots2 { /arg1 set [/in-rationalRoots2 /aa /f /comm /vvv /r /setarg /w /ans ] pushVariables [(CurrentRingp) (KanGBmessage)] pushEnv [ /aa arg1 def aa isArray { } { (<> rationalRoots2) error } ifelse /setarg 0 def oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse aa { tag } map /typev set typev [ArrayP StringP ArrayP] eq { /f aa 0 get def /vvv [ aa 1 get to_records pop ] def /w aa 2 get def /setarg 1 def } { } ifelse typev [ArrayP ArrayP ArrayP] eq { /f aa 0 get def /vvv aa 1 get {toString} map def /setarg 1 def /w aa 2 get def } { } ifelse setarg { } { (rationalRoots2 : Argument mismatch) error } ifelse [vvv from_records ring_of_polynomials 0] define_ring f { toString . } map /f set vvv { . } map /vvv set w { toString . } map /w set (rationalRoots2 -- f = ) messagen f messagen ( , vvv= ) messagen vvv messagen ( , w = ) messagen w message vvv length 1 eq w 0 get (1). eq and { [(KanGBmessage) 0] system_variable [f] groebner_sugar 0 get /f set vvv 0 get toString (s) eq { }{ [[vvv 0 get toString (s)] from_records ring_of_polynomials 0] define_ring} ifelse f 0 get toString . [[vvv 0 get toString . (s).]] replace findIntegralRoots /ans set } { oxasir.ccc [(sm1_rationalRoots2) f vvv w] asir {(integer) dc} map /ans set } ifelse /arg1 ans def ] pop popEnv popVariables arg1 } def [(rationalRoots2) [(rationalRoots2 (ox_asir function) called from intw.sm1 to analyze integral) (roots.) ]] putUsages /ptozp_subst { /arg1 set [/in-ptozp_subst /aaa /fff /xxx /vvv /vlist] pushVariables [(CurrentRingp)] pushEnv [ /aaa arg1 def /fff aaa 0 get def /xxx aaa 1 get toString def /vvv aaa 2 get {toString ..} map def aaa length 4 eq { /vlist aaa 3 get def } { /vlist 0 def } ifelse oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse fff isPolynomial { fff (ring) dc ring_def fff toString /fff set } { vlist isInteger { (ptozp_subst: need variable names.) error } { } ifelse [vlist ring_of_differential_operators 0] define_ring } ifelse oxasir.ccc [(sm1_ptozp_subst) fff . xxx . vvv] asir /arg1 set ] pop popEnv popVariables arg1 } def [(ptozp_subst) [$[f s [p q] v] ptozp_subst g (ox_asir function)$ $It returns ptozp(subst(f,s,p/q))$ $Example 1: [ (x Dx - s) (s) [2 3] (x,s)] ptozp_subst $ $ ===> 3 x Dx - 2 $ ]] putUsages /reduceByAsir { /arg1 set [/in-reduceByAsir /aaa /fff /fff0 /fff1 /vlist] pushVariables [(CurrentRingp)] pushEnv [ /aaa arg1 def /fff aaa 0 get def aaa length 2 eq { /vlist aaa 1 get def } { /vlist 0 def } ifelse oxasir.ccc [ ] eq { (Starting ox_asir server.) message ox_asirConnectMethod } { } ifelse fff isArray { fff length 2 eq { /fff0 fff 0 get def /fff1 fff 1 get def } { ([ << [f g] >> vlist ] reduceByAsir ) error } ifelse } { ([ << [f g] >> vlist ] reduceByAsir ) error } ifelse fff0 isPolynomial fff1 isPolynomial and { fff0 (ring) dc ring_def fff0 toString . /fff0 set fff1 (ring) dc ring_def fff1 toString . /fff1 set } { vlist isInteger { (reduceByAsir: need variable names.) error } { } ifelse [vlist ring_of_differential_operators 0] define_ring fff0 toString . /fff0 set fff1 toString . /fff1 set } ifelse oxasir.ccc [(sm1_rat2plist2) [fff0 fff1]] asir /arg1 set ] pop popEnv popVariables arg1 } def [(reduceByAsir) [$ [[f g] v] reduceByAsir [ff gg] (ox_asir function)$ $ [[f g]] reduceByAsir [ff gg] $ $Example 1: [[(2 x -2) (4 x - 8)] (x)] reduceByAsir $ (Note that there may be a gcd that is more than 1 among the coefficients.) ]] putUsages /oxasir.sm1.loaded 1 def initializePathNamesForOxAsir %% This should be the last.