AUTHORS:
You must have the optional commercial Maple interpreter installed and available as the command maple in your PATH in order to use this interface. You do not have to install any optional Sage packages.
Type maple.[tab] for a list of all the functions available from your Maple install. Type maple.[tab]? for Maple’s help about a given function. Type maple(...) to create a new Maple object, and maple.eval(...) to run a string using Maple (and get the result back as a string).
EXAMPLES:
sage: maple('3 * 5') # optional - maple
15
sage: maple.eval('ifactor(2005)') # optional - maple
'"(5)*"(401)'
sage: maple.ifactor(2005) # optional - maple
"(5)*"(401)
sage: maple.fsolve('x^2=cos(x)+4', 'x=0..5') # optional - maple
1.914020619
sage: maple.factor('x^5 - y^5') # optional - maple
(x-y)*(x^4+x^3*y+x^2*y^2+x*y^3+y^4)
If the string “error” (case insensitive) occurs in the output of anything from Maple, a RuntimeError exception is raised.
AUTHORS:
This tutorial is based on the Maple Tutorial for number theory from http://www.math.mun.ca/~drideout/m3370/numtheory.html.
There are several ways to use the Maple Interface in Sage. We will discuss two of those ways in this tutorial.
If you have a maple expression such as
factor( (x^5-1));
We can write that in sage as
sage: maple('factor(x^5-1)') # optional - maple
(x-1)*(x^4+x^3+x^2+x+1)
Notice, there is no need to use a semicolon.
Since Sage is written in Python, we can also import maple commands and write our scripts in a Pythonic way. For example, factor() is a maple command, so we can also factor in Sage using
sage: maple('(x^5-1)').factor() # optional - maple
(x-1)*(x^4+x^3+x^2+x+1)
where expression.command() means the same thing as command(expression) in Maple. We will use this second type of syntax whenever possible, resorting to the first when needed.
sage: maple('(x^12-1)/(x-1)').simplify() # optional - maple
x^11+x^10+x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1
The normal command will always reduce a rational function to the lowest terms. The factor command will factor a polynomial with rational coefficients into irreducible factors over the ring of integers. So for example,
sage: maple('(x^12-1)').factor( ) # optional - maple
(x-1)*(x+1)*(x^2+x+1)*(x^2-x+1)*(x^2+1)*(x^4-x^2+1)
sage: maple('(x^28-1)').factor( ) # optional - maple
(x-1)*(x^6+x^5+x^4+x^3+x^2+x+1)*(x+1)*(1-x+x^2-x^3+x^4-x^5+x^6)*(x^2+1)*(x^12-x^10+x^8-x^6+x^4-x^2+1)
Another important feature of maple is its online help. We can access this through sage as well. After reading the description of the command, you can press q to immediately get back to your original prompt.
Incidentally you can always get into a maple console by the command
sage: maple.console() # not tested
sage: !maple # not tested
Note that the above two commands are slightly different, and the first is preferred.
For example, for help on the maple command fibonacci, we type
sage: maple.help('fibonacci') # not tested, since it uses a pager
We see there are two choices. Type
sage: maple.help('combinat, fibonacci') # not tested, since it uses a pager
We now see how the Maple command fibonacci works under the combinatorics package. Try typing in
sage: maple.fibonacci(10) # optional - maple
fibonacci(10)
You will get fibonacci(10) as output since Maple has not loaded the combinatorics package yet. To rectify this type
sage: maple('combinat[fibonacci]')(10) # optional - maple
55
instead.
If you want to load the combinatorics package for future calculations, in Sage this can be done as
sage: maple.with_package('combinat') # optional - maple
or
sage: maple.load('combinat') # optional - maple
Now if we type maple.fibonacci(10), we get the correct output:
sage: maple.fibonacci(10) # optional - maple
55
Some common maple packages include combinat, linalg, and numtheory. To produce the first 19 Fibonacci numbers, use the sequence command.
sage: maple('seq(fibonacci(i),i=1..19)') # optional - maple
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,
4181
Two other useful Maple commands are ifactor and isprime. For example
sage: maple.isprime(maple.fibonacci(27)) # optional - maple
false
sage: maple.ifactor(maple.fibonacci(27)) # optional - maple
"(2)*"(17)*"(53)*"(109)
Note that the isprime function that is included with Sage (which uses PARI) is better than the Maple one (it is faster and gives a provably correct answer, whereas Maple is sometimes wrong).
sage: alpha = maple('(1+sqrt(5))/2') # optional - maple
sage: beta = maple('(1-sqrt(5))/2') # optional - maple
sage: f19 = alpha^19 - beta^19/maple('sqrt(5)') # optional - maple
sage: f19 # optional - maple
(1/2+1/2*5^(1/2))^19-1/5*(1/2-1/2*5^(1/2))^19*5^(1/2)
sage: f19.simplify() # somewhat randomly ordered output; optional - maple
6765+5778/5*5^(1/2)
Let’s say we want to write a maple program now that squares a number if it is positive and cubes it if it is negative. In maple, that would look like
mysqcu := proc(x)
if x > 0 then x^2;
else x^3; fi;
end;
In Sage, we write
sage: mysqcu = maple('proc(x) if x > 0 then x^2 else x^3 fi end') # optional - maple
sage: mysqcu(5) # optional - maple
25
sage: mysqcu(-5) # optional - maple
-125
More complicated programs should be put in a separate file and loaded.
Interface to the Maple interpreter.
Type maple.[tab] for a list of all the functions available from your Maple install. Type maple.[tab]? for Maple’s help about a given function. Type maple(...) to create a new Maple object, and maple.eval(...) to run a string using Maple (and get the result back as a string).
Create an instance of the Maple interpreter.
EXAMPLES:
sage: maple == loads(dumps(maple))
True
EXAMPLES:
sage: maple.__reduce__()
(<function reduce_load_Maple at 0x...>, ())
sage: f, args = _
sage: f(*args)
Maple
Returns the symbol used for assignment in Maple.
EXAMPLES:
sage: maple._assign_symbol()
':='
Return list of all commands defined in Maple.
EXAMPLES:
sage: c = maple._commands() # optional - maple
sage: len(c) > 100 # optional - maple
True
sage: 'dilog' in c # optional - maple
True
Returns the symbol used for equality testing in Maple.
EXAMPLES:
sage: maple._equality_symbol()
'='
sage: maple(2) == maple(2) # optional -- requires maple
True
EXAMPLES:
sage: maple._eval_line('2+2') # optional - maple
'4'
EXAMPLES:
sage: maple._function_class()
<class 'sage.interfaces.maple.MapleFunction'>
sage: type(maple.diff)
<class 'sage.interfaces.maple.MapleFunction'>
Returns the MapleFunctionElement class.
EXAMPLES:
sage: maple._function_element_class()
<class 'sage.interfaces.maple.MapleFunctionElement'>
sage: two = maple(2) # optional - maple
sage: type(two.gcd) # optional - maple
<class 'sage.interfaces.maple.MapleFunctionElement'>
Returns the Maple help on str.
EXAMPLES:
sage: maple._help('gcd') # optional - maple
"gcd - greatest common divisor of polynomials...
Hints for installing Maple on your computer.
AUTHORS:
EXAMPLES:
sage: print maple._install_hints()
In order...
Returns the class of MapleElements.
EXAMPLES:
sage: maple._object_class()
<class 'sage.interfaces.maple.MapleElement'>
sage: m = maple(2) # optional - maple
sage: type(m) # optional - maple
<class 'sage.interfaces.maple.MapleElement'>
EXAMPLES:
sage: maple._quit_string()
'quit'
sage: m = Maple()
sage: a = m(2) # optional - maple
sage: m.is_running() # optional - maple
True
sage: m.quit() # optional - maple
sage: m.is_running() # optional - maple
False
Returns the string used to read filename into Maple.
EXAMPLES:
sage: maple._read_in_file_command('test')
'read "test"'
sage: filename = tmp_filename()
sage: f = open(filename, 'w')
sage: f.write('xx := 22;\n')
sage: f.close()
sage: maple.read(filename) # optional - maple
sage: maple.get('xx').strip() # optional - maple
'22'
Tries to return the source code of a Maple function str as a string.
EXAMPLES:
sage: print maple._source('curry').strip() # optional - maple
p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
sage: maple._source('ZZZ') # optional - maple
...
Exception: no source code could be found
Returns the symbol used for truth in Maple.
EXAMPLES:
sage: maple._true_symbol()
'true'
sage: maple(2) == maple(2) # optional - maple
True
Clear the variable named var.
Unfortunately, Maple does not have a clear command. The next best thing is to set equal to the constant 0, so that memory will be freed.
EXAMPLES:
sage: maple.set('xx', '2') # optional - maple
sage: maple.get('xx') # optional - maple
'2'
sage: maple.clear('xx') # optional - maple
sage: maple.get('xx') # optional - maple
'0'
Return all commands that complete the command starting with the string s. This is like typing s[Ctrl-T] in the maple interpreter.
EXAMPLES:
sage: c = maple.completions('di') # optional - maple
sage: 'divide' in c # optional - maple
True
Spawn a new Maple command-line session.
EXAMPLES:
sage: maple.console() # not tested
|^/| Maple 11 (IBM INTEL LINUX)
._|\| |/|_. Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2007
\ MAPLE / All rights reserved. Maple is a trademark of
<____ ____> Waterloo Maple Inc.
| Type ? for help.
>
Returns the amount of CPU time that the Maple session has used. If t is not None, then it returns the difference between the current CPU time and t.
EXAMPLES:
sage: t = maple.cputime() # optional - maple
sage: t # random; optional - maple
0.02
sage: x = maple('x') # optional - maple
sage: maple.diff(x^2, x) # optional - maple
2*x
sage: maple.cputime(t) # random; optional - maple
0.0
Returns the pexpect object for this Maple session.
EXAMPLES:
sage: m = Maple()
sage: m.expect() is None
True
sage: m._start() # optional - maple
sage: m.expect() # optional - maple
<pexpect.spawn instance at 0x...>
sage: m.quit() # optional - maple
Get the value of the variable var.
EXAMPLES:
sage: maple.set('xx', '2') # optional - maple
sage: maple.get('xx') # optional - maple
'2'
Display Maple help about str. This is the same as typing “?str” in the Maple console.
INPUT:
EXAMPLES:
sage: maple.help('digamma') #not tested
Psi - the Digamma and Polygamma functions
...
Make a package of Maple procedures available in the interpreter.
INPUT:
EXAMPLES: Some functions are unknown to Maple until you use with to include the appropriate package.
sage: maple.quit() # optional -- to reset maple.
sage: maple('partition(10)') # optional -- requires maple
partition(10)
sage: maple('bell(10)') # optional -- requires maple
bell(10)
sage: maple.with_package('combinat') # optional -- requires maple
sage: maple('partition(10)') # optional -- requires maple
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 2, 2, 2], [1, 1, 2, 2, 2, 2], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 2, 2, 3], [1, 2, 2, 2, 3], [1, 1, 1, 1, 3, 3], [1, 1, 2, 3, 3], [2, 2, 3, 3], [1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 2, 4], [1, 1, 2, 2, 4], [2, 2, 2, 4], [1, 1, 1, 3, 4], [1, 2, 3, 4], [3, 3, 4], [1, 1, 4, 4], [2, 4, 4], [1, 1, 1, 1, 1, 5], [1, 1, 1, 2, 5], [1, 2, 2, 5], [1, 1, 3, 5], [2, 3, 5], [1, 4, 5], [5, 5], [1, 1, 1, 1, 6], [1, 1, 2, 6], [2, 2, 6], [1, 3, 6], [4, 6], [1, 1, 1, 7], [1, 2, 7], [3, 7], [1, 1, 8], [2, 8], [1, 9], [10]]
sage: maple('bell(10)') # optional -- requires maple
115975
sage: maple('fibonacci(10)') # optional -- requires maple
55
Set the variable var to the given value.
EXAMPLES:
sage: maple.set('xx', '2') # optional - maple
sage: maple.get('xx') # optional - maple
'2'
Display the Maple source (if possible) about s. This is the same as returning the output produced by the following Maple commands:
interface(verboseproc=2): print(s)
INPUT:
EXAMPLES:
sage: maple.source('curry') #not tested
p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
Returns a list of all the commands defined in Maple and optionally (per default) store them to disk.
EXAMPLES:
sage: c = maple.trait_names(use_disk_cache=False, verbose=False) # optional - maple
sage: len(c) > 100 # optional - maple
True
sage: 'dilog' in c # optional - maple
True
Make a package of Maple procedures available in the interpreter.
INPUT:
EXAMPLES: Some functions are unknown to Maple until you use with to include the appropriate package.
sage: maple.quit() # optional -- to reset maple.
sage: maple('partition(10)') # optional -- requires maple
partition(10)
sage: maple('bell(10)') # optional -- requires maple
bell(10)
sage: maple.with_package('combinat') # optional -- requires maple
sage: maple('partition(10)') # optional -- requires maple
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 2, 2, 2], [1, 1, 2, 2, 2, 2], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 2, 2, 3], [1, 2, 2, 2, 3], [1, 1, 1, 1, 3, 3], [1, 1, 2, 3, 3], [2, 2, 3, 3], [1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 2, 4], [1, 1, 2, 2, 4], [2, 2, 2, 4], [1, 1, 1, 3, 4], [1, 2, 3, 4], [3, 3, 4], [1, 1, 4, 4], [2, 4, 4], [1, 1, 1, 1, 1, 5], [1, 1, 1, 2, 5], [1, 2, 2, 5], [1, 1, 3, 5], [2, 3, 5], [1, 4, 5], [5, 5], [1, 1, 1, 1, 6], [1, 1, 2, 6], [2, 2, 6], [1, 3, 6], [4, 6], [1, 1, 1, 7], [1, 2, 7], [3, 7], [1, 1, 8], [2, 8], [1, 9], [10]]
sage: maple('bell(10)') # optional -- requires maple
115975
sage: maple('fibonacci(10)') # optional -- requires maple
55
Compare equality between self and other, using maple.
These examples are optional, and require Maple to be installed. You don’t need to install any Sage packages for this.
EXAMPLES:
sage: a = maple(5) # optional - maple
sage: b = maple(5) # optional - maple
sage: a == b # optional - maple
True
sage: a == 5 # optional - maple
True
sage: c = maple(3) # optional - maple
sage: a == c # optional - maple
False
sage: a < c # optional - maple
False
sage: a < 6 # optional - maple
True
sage: c <= a # optional - maple
True
sage: M = matrix(ZZ, 2, range(1,5)) # optional - maple
sage: Mm = maple(M) # optional - maple
sage: Mm == Mm # optional - maple
True
sage: Mm < 5 # optional - maple
True
sage: (Mm < 5) == (M < 5) # optional - maple
True
sage: 5 < Mm # optional - maple
False
TESTS:
sage: x = var('x')
sage: t = maple((x+1)^2) # optional -- requires maple
sage: u = maple(x^2+2*x+1) # optional -- requires maple
sage: u == t # todo: not implemented
True # returns False, should use 'testeq' in maple
sage: maple.eval('testeq(%s = %s)'%(t.name(),u.name())) # optional - maple
'true'
Returns a floating point version of self.
EXAMPLES:
sage: float(maple(1/2)) # optional - maple
0.5
sage: type(_) # optional - maple
<type 'float'>
Returns a 64-bit integer representing the hash of self. Since Python uses 32-bit hashes, it will automatically convert the result of this to a 32-bit hash.
These examples are optional, and require Maple to be installed. You don’t need to install any Sage packages for this.
EXAMPLES:
sage: m = maple('x^2+y^2') # optional - maple
sage: m.__hash__() # optional - maple
188724254834261060184983038723355865733L
sage: hash(m) # optional - maple
5035731711831192733
sage: m = maple('x^2+y^3') # optional - maple
sage: m.__hash__() # optional - maple
264835029579301191531663246434344770556L
sage: hash(m) # optional - maple
-2187277978252104690
Return a string representation of self.
These examples are optional, and require Maple to be installed. You don’t need to install any Sage packages for this.
EXAMPLES:
sage: x = var('x')
sage: maple(x) # optional - maple
x
sage: maple(5) # optional - maple
5
sage: M = matrix(QQ,2,range(4))
sage: maple(M) # optional - maple
Matrix(2, 2, [[0,1],[2,3]])
You can output Maple expressions in latex.
EXAMPLES:
sage: print latex(maple('(x^4 - y)/(y^2-3*x)')) # optional -- requires maple
{\frac {{x}^{4}-y}{{y}^{2}-3\,x}}
sage: print latex(maple(pi - e^3)) # optional -- requires maple
\pi - \left( {e^{1}} \right) ^{3}
Note
Some expressions might require the Maple style file maple2e.sty in order to latex correctly.
These examples are optional, and require Maple to be installed. You don’t need to install any Sage packages for this.
EXAMPLES:
sage: t = maple(5); u = maple(3) # optional - maple
sage: t*u # optional - maple
15
sage: M = matrix(ZZ,2,range(4)) # optional - maple
sage: Mm = maple(M) # optional - maple
sage: Mm*Mm # optional - maple
Matrix(2, 2, [[2,3],[6,11]])
sage: v = vector(ZZ,2,[2,3])
sage: vm = maple(v) # optional - maple
sage: vm*Mm # optional - maple
Vector[row](2, [6,11])
sage: t*Mm # optional - maple
Matrix(2, 2, [[0,5],[10,15]])
EXAMPLES:
sage: a = maple(2) # optional - maple
sage: 'sin' in a.trait_names() # optional - maple
True
Returns the Maple help for this function. This gets called when doing “?” on self.
EXAMPLES:
sage: maple.gcd._sage_doc_() # optional - maple
"gcd - greatest common divisor of polynomials...
Returns the source code of self. This is the function that eventually gets called when doing maple.gcd?? for example.
EXAMPLES:
sage: print maple.curry._sage_src_().strip() # optional - maple
p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
sage: maple.ZZZ._sage_src_() # optional - maple
...
Exception: no source code could be found
Returns the Maple help for this function. This gets called when doing “?” on self.
EXAMPLES:
sage: two = maple(2) # optional - maple
sage: two.gcd._sage_doc_() # optional - maple
"gcd - greatest common divisor of polynomials...
Returns the source code of self.
EXAMPLES:
sage: g = maple('gcd') # optional - maple
sage: print g.curry._sage_src_().strip() # optional - maple
p -> subs('_X' = args[2 .. nargs], () -> p(_X, args))
sage: m = maple('2') # optional - maple
sage: m.ZZZ._sage_src_() # optional - maple
...
Exception: no source code could be found
EXAMPLES:
sage: from sage.interfaces.maple import __doctest_cleanup
sage: m = maple(2) # optional - maple
sage: maple.is_running() # optional - maple
True
sage: __doctest_cleanup()
sage: maple.is_running()
False
Spawn a new Maple command-line session.
EXAMPLES:
sage: maple_console() #not tested
|^/| Maple 11 (IBM INTEL LINUX)
._|\| |/|_. Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2007
\ MAPLE / All rights reserved. Maple is a trademark of
<____ ____> Waterloo Maple Inc.
| Type ? for help.
>
Returns the maple object created in sage.interfaces.maple.
EXAMPLES:
sage: from sage.interfaces.maple import reduce_load_Maple
sage: reduce_load_Maple()
Maple