Skip to main content

A Cython frontend to the c++ library giac. (Computer Algebra System)

Project description

=============
Giacpy
=============

:Name: giacpy
:Summary: A Cython frontend to the c++ library giac. (Computer Algebra System)
:Author: Frederic Han
:Author-email: frederic.han@imj-prg.fr
:Copyright: 2012 Frederic Han
:License: GPL v2 or above
:Home-page: https://www.imj-prg.fr/~frederic.han/xcas/giacpy/



Access from python to the Computer Algebra System giac via libgiac

------------
Introduction
------------

This is an interface to be able to use from Python the Giac features.

* Giac is a general purpose Computer algebra system by Bernard Parisse released under GPLv3.

- http://www-fourier.ujf-grenoble.fr/~parisse/giac.html
- It is build on C and C++ libraries:
PARI, NTL (arithmetic), CoCoA (Groebner basis), GSL (numerics),
GMP (big integers), MPFR (bigfloats)
- It provides (fast) algorithms for multivariate polynomial operations (product, GCD, factorisation) and
- symbolic computations: solver, simplifications, limits/series, integration, sommation...
- Linear Algebra with numerical or symbolic coefficients.


* giacpy is an interface to this library. It is built with cython. Graphic output is obtained with qcas by Loic Lecoq: http://git.tuxfamily.org/qcas/qcas.git


-----------
Short Usage
-----------

Example::

>>> import giacpy # outputs various messages
Help file ... aide_cas not found
Added 0 synonyms
>>> giacpy.ifactor(2**128+1)
59649589127497217*5704689200685129054721
>>> from giacpy import giac
>>> x,y,z=giac('x,y,z')
>>> f=(x+y+z+1)**15+1
>>> g=(f*(f+1)).normal()
>>> print g.nops()
>>> print g.factor().nops()
>>> f.diff()

Help::

>>> help("giacpy")
>>> from giacpy import normal
>>> print(normal.__doc__) ; # to have help on some giac keyword
>>> solve.htmlhelp('fr') ; # (may be not avaible on your system) to have detailled help on some giac keyword
>>> htmlhelp() ; # to have help the global help pages.


* Graphics 2D Output: (cf. help('giacpy') for examples)
If your version of giacpy has qt support, you can send graphics to qcas with the .qcas() method. For experimental interactive geometry see: help(qcas)


-------
Install
-------

* To build the extension from sources (unix):

- You need the giac library, gmp and python headers. Ex: giac, libgmp-dev python-dev

- Then execute the command: python setup.py build_ext (or try the: make or make local)

- If you need some options see: python setup.py build_ext --help

- To install giacpy on unix (needs libgiac): python setup.py install

* For binaries of giacpy: http://webusers.imj-prg.fr/~frederic.han/xcas/giacpy/

* To run tests you can try: make test
or run: python -m doctest giacpy.pyx -v (in the directory of giapy.so if it is not installed)


-----------------------------------
Short Tutorial on the giac function
-----------------------------------

This function evaluate a python object with the giac library.

* It creates in python a Pygen element and evaluate it with giac:


>>> from giacpy import giac,pi
>>> x,y=giac('x,y');type(x)
<type 'giacpy.Pygen'>
>>> (x+2*y).cos().texpand()
cos(x)*(2*cos(y)**2-1)-sin(x)*2*cos(y)*sin(y)


Coercion, Pygen and internal giac variables:
--------------------------------------------

* The most usefull objects will be the Python object of type Pygen.

>>> from giacpy import *
>>> x,y,z=giac('x,y,z')
>>> f=sum([x[i] for i in range(5)])**15/(y+z);f.coeff(x[0],12)
(455*(x[1])**3+1365*(x[1])**2*x[2]+1365*(x[1])**2*x[3]+1365*(x[1])**2*x[4]+1365*x[1]*(x[2])**2+2730*x[1]*x[2]*x[3]+2730*x[1]*x[2]*x[4]+1365*x[1]*(x[3])**2+2730*x[1]*x[3]*x[4]+1365*x[1]*(x[4])**2+455*(x[2])**3+1365*(x[2])**2*x[3]+1365*(x[2])**2*x[4]+1365*x[2]*(x[3])**2+2730*x[2]*x[3]*x[4]+1365*x[2]*(x[4])**2+455*(x[3])**3+1365*(x[3])**2*x[4]+1365*x[3]*(x[4])**2+455*(x[4])**3)/(y+z)


* The Python object y of type Pygen is not an internal giac variable. (Most of the time you won't need to use internal giac variables).

>>> type(y);giac('y:=1');y
<type 'giacpy.Pygen'>
1
y

* There are some natural coercion to Pygen elements:

>>> pi>3.14 ; pi >3.15 ; giac(3)==3
True
False
True


Lists of Pygen and Giac lists:
------------------------------

* Here l1 is a giac list and l2 a python list of Pygen type objects.

>>> l1=giac(range(10)); l2=[1/(i**2+1) for i in l1]
>>> sum(l2)
33054527/16762850

So l1+l1 is done in giac and means a vector addition. But l2+l2 is done in Python so it is the list concatenation.

>>> l1+l1
[0,2,4,6,8,10,12,14,16,18]
>>> l2+l2
[1, 1/2, 1/5, 1/10, 1/17, 1/26, 1/37, 1/50, 1/65, 1/82, 1, 1/2, 1/5, 1/10, 1/17, 1/26, 1/37, 1/50, 1/65, 1/82]


* Here V is not a Pygen element. We need to push it to giac to use a giac method like dim, or we need to use an imported function.

>>> V=[ [x[i]**j for i in range(9)] for j in range(9)]
>>> giac(V).dim()
[9,9]
>>> det_minor(V).factor()
(x[7]-(x[8]))*(x[6]-(x[8]))*(x[6]-(x[7]))*(x[5]-(x[8]))*(x[5]-(x[7]))*(x[5]-(x[6]))*(x[4]-(x[8]))*(x[4]-(x[7]))*(x[4]-(x[6]))*(x[4]-(x[5]))*(x[3]-(x[8]))*(x[3]-(x[7]))*(x[3]-(x[6]))*(x[3]-(x[5]))*(x[3]-(x[4]))*(x[2]-(x[8]))*(x[2]-(x[7]))*(x[2]-(x[6]))*(x[2]-(x[5]))*(x[2]-(x[4]))*(x[2]-(x[3]))*(x[1]-(x[8]))*(x[1]-(x[7]))*(x[1]-(x[6]))*(x[1]-(x[5]))*(x[1]-(x[4]))*(x[1]-(x[3]))*(x[1]-(x[2]))*(x[0]-(x[8]))*(x[0]-(x[7]))*(x[0]-(x[6]))*(x[0]-(x[5]))*(x[0]-(x[4]))*(x[0]-(x[3]))*(x[0]-(x[2]))*(x[0]-(x[1]))

* Modular objects with %

>>> V=ranm(5,5) % 2;
>>> ker(V).rowdim()+V.rank()
5
>>> a=giac(7)%3;a;a%0;7%3
1 % 3
1
1

Do not confuse with the full python integers:

>>> type(7%3);type(a)
<type 'int'>
<type 'giacpy.Pygen'>

Syntaxes with reserved or unknown Python symbols:
-------------------------------------------------

* In general equations needs symbols such as = < > or that have another meaning in Python. So those objects must be quoted.

>>> from giacpy import *
>>> x=giac('x')
>>> (1+2*sin(3*x)).solve(x)
list[-pi/3/6,7*pi/18]

>>> solve('sin(3*x)>2*sin(x)',x)
Traceback (most recent call last):
...
RuntimeError: Unable to find numeric values solving equation. For trigonometric equations this may be solved using assumptions, e.g. assume(x>-pi && x<pi) Error: Bad Argument Value


* You can also add some hypothesis to a giac symbol:

>>> assume('x>-pi && x<pi')
x
>>> solve('sin(3*x)>2*sin(x)',x)
list[((x>((-5*pi)/6)) and (x<((-pi)/6))),((x>0) and (x<(pi/6))),((x>(5*pi/6)) and (x<pi))]

* To remove those hypothesis use the giac function: purge

>>> purge('x')
assume[[],[line[-pi,pi]],[-pi,pi]]
>>> solve('x>0')
list[x>0]


* Same problems with the ..

>>> from giacpy import *
>>> x=giac('x')
>>> f=1/(5+cos(4*x));f.int(x)
1/2/(2*sqrt(6))*(atan(2*tan(4*x/2)/sqrt(6))+pi*floor(4*x/2/pi+1/2))
>>> fMax(f,'x=-0..pi').simplify()
pi/4,3*pi/4
>>> fMax.help()
"Returns the abscissa of the maximum of the expression.
Expr,[Var]
fMax(-x^2+2*x+1,x)
fMin"
>>> sum(1/(1+x**2),'x=0..infinity').simplify()
(pi*exp(pi)**2+pi+exp(pi)**2-1)/(2*exp(pi)**2-2)





---------
Changelog
---------


* Version 0.2:
- Add a comparison function to Pygen. (with coersion)
- Add a basic definition for most giac functions.
- Add some help.

* Version 0.2.1:
- Add __neg__ and __pos__ support for Pygen. (Ex: -pi)
- Change __repr__ to hide too long outputs.
- Make ** be the default printing for powers in giac.

* Version 0.2.2:
- Change Pygen() to Pygen('NULL'). (Ex: rand())
- Add direct acces to the python double value of a Pygen: a._double
- Add conversion to giac modulars via the operator %
- Add ctrl-c support during list initialisation and iteration
- Modification of __getitem__ to allow formal variables with indexes.
- Add htmlhelp method for Pygen objects.
- Improve the giac initialisation of Python long integers. (basic Horner method instead of strings)
- Improve help(giac) and doctests
- Add support for the slice notation with giac lists

* Version 0.2.3:
- Fix Pygen() None initialisation. Add crash test and improve speed in _wrap_gen
- Add a small Makefile
- Add a GiacSettings class with some frontends to the cas settings.
- Add French keywords

* Version 0.2.4:
- Update giac 1.1 keywords.

* Version 0.3:
- Add a qt output for 2d graphics via qcas.
- Fixes for giac 1.1

* Version 0.4:
- Fixes for Python 3 compatibility
- Qt/qcas can be disabled at compilation. (cf setup.py)
- 0.4.1:
+ add some giac keywords.
+ add proba_epsilon in GiacSetting.
+ test if the html doc is present locally, otherwise open the web doc.
- 0.4.2:
+ add digits and epsilon in GiacSetting.
+ Fix for interruptions of giac operators.
+ Put all the GiacKeywords in a new class: GiacFunction to enable docstrings from giac.
- 0.4.3:
+ Update qcas to current version. (svg export added)
+ New evaluation with threads to have better interruptions.
- 0.4.4:
+ Add sqrt and complex flags in giac settings.
+ Add support for multi indexes. Ex A[1,2].

* Version 0.5:
- 0.5.0:
+ Put all the Qt/Graphics functions in an independant submodule
+ Add a save method for Pygen and a loadgiacgen function.
- 0.5.2:
+ Update keywords and clean __init__.py docstring
- 0.5.3:
+ improve setup.py for mingw built
- 0.5.4:
+ update giac.dll windows binary to giac 1.2.3-57 with subsop patch
and rowreduction-R55929 patch
+ post1: update win64 giac.dll to fix: interface with pari; matrix mul
for integers

* Version 0.6:
- 0.6.0:
+ add a __setitem__ for Pygen elements. Ex: A[1,2]=3
+ add Linear algebra tutorial in the giac docstring.
- 0.6.1:
+ update giac keywords.
- 0.6.2:
+ add _repr_html_ and _repr_latex_ for jupyter output
+ rebuild giac.dll without ntl.
- 0.6.3:
+ fix for randseed, srand
+ update keywords
+ remove qcas from tree; libqcas
- 0.6.4:
+ try to guess qt install from qmake
+ upgrade giac.dll to 1.4.9.43
+ fix keywords update
- 0.6.5:
+ Add GPL-2 in MANIFEST.in
- 0.6.6:
+ disable include_package_data in setup.py to not install *.cpp files
and remove from install directory other source files that are not needed
by python nor by cython users.
+ windows rebuilt with giac-1.4.9-45 with NTL enabled

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

giacpy-0.6.6.tar.gz (397.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

giacpy-0.6.6-cp36-cp36m-win_amd64.whl (15.2 MB view details)

Uploaded CPython 3.6mWindows x86-64

giacpy-0.6.6-cp36-cp36m-win32.whl (13.9 MB view details)

Uploaded CPython 3.6mWindows x86

giacpy-0.6.6-cp35-cp35m-win_amd64.whl (15.2 MB view details)

Uploaded CPython 3.5mWindows x86-64

giacpy-0.6.6-cp35-cp35m-win32.whl (13.9 MB view details)

Uploaded CPython 3.5mWindows x86

giacpy-0.6.6-cp34-cp34m-win_amd64.whl (15.2 MB view details)

Uploaded CPython 3.4mWindows x86-64

giacpy-0.6.6-cp34-cp34m-win32.whl (13.9 MB view details)

Uploaded CPython 3.4mWindows x86

giacpy-0.6.6-cp27-cp27m-win_amd64.whl (15.2 MB view details)

Uploaded CPython 2.7mWindows x86-64

giacpy-0.6.6-cp27-cp27m-win32.whl (13.9 MB view details)

Uploaded CPython 2.7mWindows x86

File details

Details for the file giacpy-0.6.6.tar.gz.

File metadata

  • Download URL: giacpy-0.6.6.tar.gz
  • Upload date:
  • Size: 397.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for giacpy-0.6.6.tar.gz
Algorithm Hash digest
SHA256 64746bf35b7ee7a789825d2a7164d629963571454f2e27b34a9dfdc99b87d1ba
MD5 a50e8bd81c07be4447e1cd07a130eba9
BLAKE2b-256 f96e69a23b327bea79071c0fc5744a91752fd676bac5e4c66c74eaf545ee61b8

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 9ac39c0b004957946fdab1ca1eb2920b0bc4ca13e1efa6b26b8d8467f32a84ea
MD5 4fc6769a69ae6422bcc58f571400168b
BLAKE2b-256 ca207fdc7f07ee68d897cb33bdecb182e678f4c8f99c273fb046f58ebf4e2e6d

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 95b3def841aec5e8b35929696121fe98db4fb52bf8d6ce68ad25b85e5ef8ce42
MD5 d69db95c48eaa2ccff359fa874e92446
BLAKE2b-256 20350fa3c1eae583fe5a5cd9a95681cbccb14f48f8e08e460e37de56b7e65c2d

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 bdb56e9f06dc04763b1c5abab70781eff71c82f785eb9f5f47e64e00848ccee8
MD5 a6f5978c7eb33bd789e0179e5ee62239
BLAKE2b-256 ef49d1f46c2033d4ef0727162cd2a04fd631fb74d011fafbe2de1db8ba9b930d

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 ae05868da399ec8f23ef142714a5b19c9845b0e839047721398c96bbb1745ede
MD5 1327516f007b866fc7b012aef7d3717a
BLAKE2b-256 f708dfe73a04481dc9a009a0adf39d5729218665fc3ca335878e72c1c6488c9d

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 5be3a3ea79f8eaf2a4ddc911eec1012a85fad651e34918525e5394951de88ec0
MD5 d48a1b34af1eef75b4c1e0eb931c8cbb
BLAKE2b-256 45cac0bccd75f161b3e5b2289e3fb89809a2ddd9f8fbf0449cc2851819cbbdda

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 49985a7463e568b1527bcd04c7c1cbca1766a613d5bb13fd10ca1864cb2c7264
MD5 cc6d1c79c6055340d513338b023249f4
BLAKE2b-256 4814deafcd3db26ae7ea44e5167c84f39b772bfbd1b8905731c09334f3e818b8

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp27-cp27m-win_amd64.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 224195f3877cd5052def7103384d38ef4e45259ccfaa182b6c0f154a342c948e
MD5 f979e349baf387ff07edc2e54b5d0b03
BLAKE2b-256 ecce6379f7464c2728d7cf97b460d5c5d407498918a5584f207898b592da7614

See more details on using hashes here.

File details

Details for the file giacpy-0.6.6-cp27-cp27m-win32.whl.

File metadata

File hashes

Hashes for giacpy-0.6.6-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 3320fafc4e9056a6a22c356f3c190fc35810b09764810052dff094788d143c47
MD5 cf8be40c8a5e6a760934c75166e59687
BLAKE2b-256 447d72f28722cebe8bbdd71282c7a8aba45b886064419aee637b198bcac64157

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page