# HG changeset patch
# User Burcin Erocal <burcin@erocal.org>
# Date 1223885551 -7200
# Node ID 1611ab2e6f45c6b11ace32518e8d36e8231179ed
# Parent  5e45f3ee796ad08b6a3467a21f4809ba9e2d69dc
Initial wrapper for plural.

diff --git a/module_list.py b/module_list.py
--- a/module_list.py
+++ b/module_list.py
@@ -550,6 +550,12 @@
 
     Extension('sage.rings.polynomial.multi_polynomial_ideal_libsingular',
               sources = ['sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx'],
+              libraries = ['m', 'readline', 'singular', 'singcf', 'singfac', 'omalloc', 'givaro', 'gmpxx', 'gmp'],
+              language="c++",
+              include_dirs=debian_include_dirs + [SAGE_ROOT +'/local/include/singular']),
+
+    Extension('sage.rings.polynomial.plural',
+              sources = ['sage/rings/polynomial/plural.pyx'],
               libraries = ['m', 'readline', 'singular', 'singcf', 'singfac', 'omalloc', 'givaro', 'gmpxx', 'gmp'],
               language="c++",
               include_dirs=debian_include_dirs + [SAGE_ROOT +'/local/include/singular']),
diff --git a/sage/libs/singular/singular-cdefs.pxi b/sage/libs/singular/singular-cdefs.pxi
--- a/sage/libs/singular/singular-cdefs.pxi
+++ b/sage/libs/singular/singular-cdefs.pxi
@@ -690,6 +690,10 @@
     
     int MATROWS(matrix *)
 
+# Plural functions
+    
+    int nc_CallPlural(matrix* CC, matrix* DD, poly* CN, poly* DN, ring* r)
+
 cdef extern from "stairc.h":
     # Computes the monomial basis for R[x]/I
     ideal *scKBase(int deg, ideal *s, ideal *Q)
diff --git a/sage/rings/polynomial/plural.pxd b/sage/rings/polynomial/plural.pxd
new file mode 100644
--- /dev/null
+++ b/sage/rings/polynomial/plural.pxd
@@ -0,0 +1,7 @@
+include "../../libs/singular/singular-cdefs.pxi"
+
+from sage.rings.polynomial.multi_polynomial_libsingular cimport MPolynomialRing_libsingular, MPolynomial_libsingular
+
+cdef class MPolynomialRing_plural(MPolynomialRing_libsingular):
+    pass
+
diff --git a/sage/rings/polynomial/plural.pyx b/sage/rings/polynomial/plural.pyx
new file mode 100644
--- /dev/null
+++ b/sage/rings/polynomial/plural.pyx
@@ -0,0 +1,34 @@
+include "sage/ext/stdsage.pxi"
+include "sage/ext/interrupt.pxi"
+
+cdef class MPolynomialRing_plural(MPolynomialRing_libsingular):
+    def __init__(self, base_ring, n, names, order='degrevlex'):
+        MPolynomialRing_libsingular.__init__(self, base_ring, n, names, order)
+
+        cdef matrix* matc=mpNew(n,n)
+        cdef matrix* matd=mpNew(n,n)
+
+        for i from 0 <= i < n:
+            for j from i+1 <= j < n:
+                matc.m[n*i+j] = p_ISet(-1, self._ring)
+
+        for i from 0 <= i < n:
+            for j from i+1 <= j < n:
+                matd.m[n*i+j] = p_ISet(-1, self._ring)
+
+        nc_CallPlural(matc, matd, NULL, NULL, self._ring)
+
+        id_Delete(<ideal**>&matc, self._ring)
+        id_Delete(<ideal**>&matd, self._ring)
+ 
+    def _repr_(self):
+        """
+        EXAMPLE:
+            sage: from sage.rings.polynomial.plural import MPolynomial_plural
+            sage: P = MPolynomialRing_plural(QQ, 2, 'x,y')
+            sage: P # indirect doctest
+            Multivariate Polynomial Ring in x, y over Rational Field
+        """
+#TODO: print the relations
+        varstr = ", ".join([ rRingVar(i,self._ring)  for i in range(self.__ngens) ])
+        return "Noncommutative Multivariate Polynomial Ring in %s over %s"%(varstr,self.base_ring())
