Skip to main content

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

Project description

Name:

giacpy

Summary:

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

Author:

Frederic Han

Author-email:

frederic.han@imj-prg.fr

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

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

giacpy-0.5.4-cp36-cp36m-win_amd64.whl (15.0 MB view details)

Uploaded CPython 3.6mWindows x86-64

giacpy-0.5.4-cp36-cp36m-win32.whl (16.7 MB view details)

Uploaded CPython 3.6mWindows x86

giacpy-0.5.4-cp35-cp35m-win_amd64.whl (15.0 MB view details)

Uploaded CPython 3.5mWindows x86-64

giacpy-0.5.4-cp35-cp35m-win32.whl (16.7 MB view details)

Uploaded CPython 3.5mWindows x86

giacpy-0.5.4-cp34-cp34m-win_amd64.whl (15.0 MB view details)

Uploaded CPython 3.4mWindows x86-64

giacpy-0.5.4-cp34-cp34m-win32.whl (16.7 MB view details)

Uploaded CPython 3.4mWindows x86

giacpy-0.5.4-cp27-cp27m-win_amd64.whl (15.0 MB view details)

Uploaded CPython 2.7mWindows x86-64

giacpy-0.5.4-cp27-cp27m-win32.whl (16.7 MB view details)

Uploaded CPython 2.7mWindows x86

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 438092381015b05a187467c7f6f36939d9e55b75a6609f5ba0a02ba359f677eb
MD5 4b0f57246186a22acdba1b4ff9a6edcd
BLAKE2b-256 0afb0a617336f0c9e8c1720be637a32813db822f67857104db7de142f94d98b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 22b45ac31a4f93bf5260cf0ea5dab9b1c85b5fc5ac23f02900d4db15fd429898
MD5 1b0363eefed224ddf54f1aa0c0436db2
BLAKE2b-256 600a8425605e6b4f812c379edcc2812b3ff1f04a349bfd245bb762075cf2aad2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 a75d0f11ac34142d06a7a60eb82a28d14028c353e304c2b8b11be60daeb0c035
MD5 2efccef952bc6bd117312155be94ff34
BLAKE2b-256 0e213cbd6de94e30fb2109aedb8fb750ba0f4e1e3873a74406170e02477c58c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 66a453e1c5606913d7323b7f0217a7c99148ea28858926e7f5fc90eada934644
MD5 3dc46ebf6ec0c456108e8f7dd23cdf92
BLAKE2b-256 72374e4e7ede71b80939904a39bd9b552c772e9dd213844731ed87068a1ea6d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 5388ab1c0f73dff9ffe49ea1176f4928c2dda907372421d0358b0f4308c9b206
MD5 df16e96b113dd6b9f8740bb15d452aab
BLAKE2b-256 8e8eb67ecef1503d83a8322b83a71ddf8154d8e066b81468a2f61ebbdae29d87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 dde820de3f359c485ed2f2bfdb05dacd6ea1ce4b08e63ea497de33fd0f02050b
MD5 144a0a7d60a647b129c2b09e2223e3bd
BLAKE2b-256 17ad71a4cfdbce690b9f7d8dae80671fa7f817a45a7681b8e1e8f3b39b43f9e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 65354232b5f97a105b374dba12e37edbedf6cb2af14915bf6eb77f7324ec3431
MD5 f8513afe2291e8682fe1c45b7c902b26
BLAKE2b-256 a43eabc8c89dc03250229fd55c983d3fb8795a8f9a9e58da17fb0f9f07b5c645

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for giacpy-0.5.4-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 d83e0f4da29e6503e9f1f30751be7d33a28049b27279d973e0243e122f5c4ee5
MD5 bd052f0515c4018be46a82a37dfbd9e6
BLAKE2b-256 88742d1ea736cbfe36a3dfeb9e8924d04e5c6ddf57fb338e413e2059e0983cb7

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