Revert "*Bug #13511 fixed - Polynomials: lcm with large values" 97/15397/2
Paul Bignier [Fri, 17 Oct 2014 13:23:44 +0000 (15:23 +0200)]
This reverts commit e2a62b0dfaa19cc4d0b8df6ed20a23425157c045.

Change-Id: I41b650eab0086d6ac7a6f53eef57c601d9c4bc1c

17 files changed:
scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/help/en_US/discrete/gcd.xml
scilab/modules/elementary_functions/help/en_US/discrete/lcm.xml
scilab/modules/elementary_functions/help/fr_FR/discrete/gcd.xml
scilab/modules/elementary_functions/help/fr_FR/discrete/lcm.xml
scilab/modules/overloading/macros/%s_bezout.sci [deleted file]
scilab/modules/overloading/macros/%s_gcd.sci [deleted file]
scilab/modules/overloading/macros/%s_lcm.sci [deleted file]
scilab/modules/polynomials/help/en_US/bezout.xml
scilab/modules/polynomials/help/fr_FR/bezout.xml
scilab/modules/polynomials/macros/gcd.sci
scilab/modules/polynomials/macros/lcm.sci
scilab/modules/polynomials/sci_gateway/fortran/sci_f_bezout.f
scilab/modules/polynomials/tests/nonreg_tests/bug_12679.dia.ref
scilab/modules/polynomials/tests/nonreg_tests/bug_12679.tst
scilab/modules/polynomials/tests/nonreg_tests/bug_13511.dia.ref [deleted file]
scilab/modules/polynomials/tests/nonreg_tests/bug_13511.tst [deleted file]

index 3c94390..377b582 100644 (file)
@@ -242,8 +242,6 @@ Scilab Bug Fixes
 
 * Bug #13510 fixed - Datatip callback cleared 'd'.
 
-* Bug #13511 fixed - lcm returned incorrect results when used with doubles.
-
 * Bug #13512 fixed - dae crashed if the evaluation function had wrong prototype.
 
 * Bug #13515 fixed - There were wrong results for matrix/hypermatrix with bitset.
@@ -256,7 +254,7 @@ Scilab Bug Fixes
 
 * Bug #13543 fixed - "slider" uicontrols did not work with the mouse wheel.
 
-* Bug #13554 fixed - rubberbox returned wrong values.
+* Bug #13554 fixed - rubberbox returns wrong values.
 
 * Bug #13579 fixed - bar displayed useless warnings.
 
index f07a8ef..b87d940 100644 (file)
@@ -67,6 +67,9 @@
             The greatest common divisor of an array <literal>p</literal> of real numbersof real numbers can be obtained by
             converting it to a polynomial before calling <literal>gcd</literal>, through <code>p = inv_coeff(p, 0)</code>.
         </para>
+        <para>
+            If <literal>p</literal> is given as an integer double (type 1), then it is treated as an <literal>int32</literal>.
+        </para>
     </refsection>
     <refsection>
         <title>Examples</title>
index 7e3fe4a..4021a39 100644 (file)
@@ -60,6 +60,9 @@
             The least common multiple of an array <literal>p</literal> of real numbers can be obtained by
             converting it to a polynomial before calling <literal>lcm</literal>, through <code>p = inv_coeff(p, 0)</code>.
         </para>
+        <para>
+            If <literal>p</literal> is given as an integer double (type 1), then it is treated as an <literal>int32</literal>.
+        </para>
     </refsection>
     <refsection>
         <title>Examples</title>
@@ -71,11 +74,11 @@ p = [s s*(s+1)^2 s^2*(s+2)];
 p.*fact, pp
 
 // Integer case
-V = int32([2^2*3^5 2^3*3^2 2^2*3^4*5]);
+V = int32([2^2*3^5, 2^3*3^2,2^2*3^4*5]);
 lcm(V)
 
 // Double case
-V = [2^2*3^5  2^3*3^2 2^2*3^4*5];
+V = [2^2*3^5, 2^3*3^2,2^2*3^4*5];
 lcm(V)
  ]]></programlisting>
     </refsection>
index 0a06e7e..16d5123 100644 (file)
@@ -49,6 +49,9 @@
             Le PGCD d'une matrice <literal>p</literal> de réels peut s'obtenir en la convertissant en polynôme
             avant d'appeler <literal>gcd</literal>, grâce à la commande <literal>p = inv_coeff(p, 0)</literal>.
         </para>
+        <para>
+            Si <literal>p</literal> est donné comme un flottant entier (type 1), alors il est traité comme un <literal>int32</literal>.
+        </para>
     </refsection>
     <refsection>
         <title>Exemples</title>
index 97a7305..6c3e019 100644 (file)
@@ -52,6 +52,9 @@
             Le plus petit commun multiple d'une matrice <literal>p</literal> de réels peut s'obtenir en la convertissant
             en polynôme avant d'appeler <literal>lcm</literal>, grâce à la commande <literal>p = inv_coeff(p, 0)</literal>.
         </para>
+        <para>
+            Si <literal>p</literal> est donné comme un flottant entier (type 1), alors il est traité comme un <literal>int32</literal>.
+        </para>
     </refsection>
     <refsection>
         <title>Exemples</title>
@@ -63,11 +66,11 @@ p = [s s*(s+1)^2 s^2*(s+2)];
 p.*fact, pp
 
 // Cas des entiers
-V = int32([2^2*3^5 2^3*3^2 2^2*3^4*5]);
+V = int32([2^2*3^5, 2^3*3^2,2^2*3^4*5]);
 lcm(V)
 
 // Cas des doubles
-V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
+V = [2^2*3^5, 2^3*3^2,2^2*3^4*5];
 lcm(V)
  ]]></programlisting>
     </refsection>
diff --git a/scilab/modules/overloading/macros/%s_bezout.sci b/scilab/modules/overloading/macros/%s_bezout.sci
deleted file mode 100644 (file)
index 641c26b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function [g,u] = %s_bezout(a,b)
-    //   g = bezout(a,b) is the greatest common divisor of a and b.
-    //       a and b must contain non-negative integer scalars.
-    //   [g,U] = bezout(a,b) also returns a (2x2) unimodular matrix U such that:
-    //   [a,b]*U = [g,0].
-    //   These are useful for solving Diophantine equations and computing
-    //   Hermite transformations.
-
-    u = [1 0 a];
-    v = [0 1 b];
-    while v(3)<>0
-        q = floor(u(3)/v(3));
-        t = u - v*q;
-        u = v;
-        v = t;
-    end
-    g = u(3);
-    u=[u(1) -v(1);u(2) -v(2)]
-
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_gcd.sci b/scilab/modules/overloading/macros/%s_gcd.sci
deleted file mode 100644 (file)
index 2480524..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function [x,uu]=%s_gcd(p)
-    //Given a polynomial vector p, [pgcd,u]=gcd(p) computes the gcd
-    //of components and a unimodular matrix (with polynomial inverse) u,
-    //with minimal degree such that [p1 p2]*u=[0 ... 0 pgcd]
-    //!
-
-    [lhs,rhs]=argn(0)
-    [m,n]=size(p);
-    mn=m*n
-    p=matrix(p,1,mn)
-    x=p(1);
-    uu=1
-    for l=2:mn,
-        [x,u]=bezout(x,p(l)),
-        if lhs==2 then
-            uu=[uu(:,1:l-2) uu(:,l-1)*u(1,[2 1])];uu(l,l-1:l)=u(2,[2 1]);
-        end
-    end,
-    if lhs==1 then return,end
-    for l=mn:-1:2
-        pivot=uu(l,l-1);
-        for k=l:mn
-            q=floor(uu(l,k)/pivot)
-            r=uu(l,k)-q*pivot
-            if q<>0 then
-                uu(1:l-1,k)=uu(1:l-1,k)-q*uu(1:l-1,l-1)
-                uu(l,k)=r;
-            end
-        end
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_lcm.sci b/scilab/modules/overloading/macros/%s_lcm.sci
deleted file mode 100644 (file)
index 1ea9d93..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - Serge Steer
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function [q,fact]=%s_lcm(p)
-    //p=lcm(p) computes the lcm of polynomial vector p
-    //[pp,fact]=lcm(p) computes besides the vector fact of factors
-    //such that  p.*fact=pp*ones(p)
-    //!
-
-    k=find(p==0)
-    if k<>[] then q=p(k(1)),fact=0*ones(p),fact(k)=1,return,end
-
-    q=p(1);
-    for k=2:size(p,"*")
-        q=floor(q/%s_gcd([q,p(k)]))*p(k);
-    end
-    fact=floor(q./p)
-endfunction
index 01fb490..fdbe231 100644 (file)
@@ -25,7 +25,7 @@
             <varlistentry>
                 <term>p1, p2</term>
                 <listitem>
-                    <para>two real polynomials or two integer scalars (type equal to 1 or 8)</para>
+                    <para>two real polynomials or two integer scalars (type equal to 8)</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-// Polynomials
-x = poly(0,'x');
+// Polynomial case
+x = poly(0, 'x');
 p1 = (x+1)*(x-3)^5;
 p2 = (x-2)*(x-3)^3;
-[pgcd,U] = bezout(p1, p2)
+[thegcd,U] = bezout(p1, p2)
 det(U)
 clean([p1 p2]*U)
-ppcm = p1*U(1,2)
+thelcm = p1*U(1,2)
 lcm([p1 p2])
 
-// Integers
+// Integer case
 i1 = int32(2*3^5);
 i2 = int32(2^3*3^2);
 [thegcd,U] = bezout(i1, i2)
@@ -83,15 +83,6 @@ V = int32([2^2*3^5 2^3*3^2 2^2*3^4*5]);
 [thegcd,U] = gcd(V)
 V*U
 lcm(V)
-
-// Doubles
-i1 = 2*3^5;
-i2 = 2^3*3^2;
-[thegcd,U] = bezout(i1, i2)
-V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
-[thegcd,U] = gcd(V)
-V*U
-lcm(V)
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
index 56e7ec3..0611f09 100644 (file)
@@ -14,7 +14,7 @@
             <varlistentry>
                 <term>p1, p2  </term>
                 <listitem>
-                    <para>deux polynômes réels ou deux entiers (type égal à 1 ou 8)
+                    <para>deux polynômes réels ou deux entiers (type égal à 8)
                     </para>
                 </listitem>
             </varlistentry>
     </refsection>
     <refsection>
         <title>Exemples</title>
-        <programlisting role="example"><![CDATA[
-// Polynômes
-x = poly(0,'x');
-p1 = (x+1)*(x-3)^5;
-p2 = (x-2)*(x-3)^3;
-[pgcd,U] = bezout(p1, p2)
+        <programlisting role="example"><![CDATA[ 
+// cas des polynômes
+x=poly(0,'x');
+p1=(x+1)*(x-3)^5;p2=(x-2)*(x-3)^3;
+[pgcd,U]=bezout(p1,p2) 
 det(U)
-clean([p1 p2]*U)
-ppcm = p1*U(1,2)
-lcm([p1 p2])
+clean([p1,p2]*U)
+ppcm=p1*U(1,2)
+lcm([p1,p2])
 
-// Entiers
-i1 = int32(2*3^5);
-i2 = int32(2^3*3^2);
-[thegcd,U] = bezout(i1, i2)
-V = int32([2^2*3^5 2^3*3^2 2^2*3^4*5]);
-[thegcd,U] = gcd(V)
-V*U
-lcm(V)
-
-// Doubles
-i1 = 2*3^5;
-i2 = 2^3*3^2;
-[thegcd,U] = bezout(i1, i2)
-V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
-[thegcd,U] = gcd(V)
+// cas des entiers
+i1=int32(2*3^5); i2=int32(2^3*3^2);
+[thegcd,U]=bezout(i1,i2) 
+V=int32([2^2*3^5, 2^3*3^2,2^2*3^4*5]);
+[thegcd,U]=gcd(V)
 V*U
 lcm(V)
  ]]></programlisting>
index a957735..ee9f47a 100644 (file)
@@ -18,17 +18,15 @@ function [x, uu] = gcd(p)
         error(msprintf(_("%s: Wrong type for argument #%d: Integer array or Polynomial expected.\n"), "gcd", 1));
     end
 
-    [lhs,rhs]=argn(0);
-
     if type(p)==1 then
         if floor(p)<>p then
             error(msprintf(_("%s: Wrong type for argument #%d: Integer array or Polynomial expected.\n"), "gcd", 1));
         else
-            if lhs==2 then [x,uu]=%s_gcd(p), else x=%s_gcd(p), end
-            return
+            p = iconvert(p,4);
         end
     end
 
+    [lhs,rhs]=argn(0)
     if type(p)==8 then
         if lhs==2 then [x,uu]=%i_gcd(p), else x=%i_gcd(p), end
         return
index 35af760..f079000 100644 (file)
@@ -22,8 +22,7 @@ function [p, fact] = lcm(p)
         if floor(p)<>p then
             error(msprintf(_("%s: Wrong type for argument #%d: Integer array or Polynomial expected.\n"), "lcm", 1));
         else
-            if argn(1)==2 then [p, fact] = %s_lcm(p), else p = %s_lcm(p), end
-            return
+            p = iconvert(p,4);
         end
     end
 
index f5509c1..21cc216 100644 (file)
@@ -34,7 +34,7 @@ c
       ilb=iadr(lstk(top))
       ilbr=ilb
       if(istk(ilb).lt.0) ilb=iadr(istk(ilb+1))
-      if(istk(ilb).eq.1.or.istk(ilb).gt.2) then
+      if(istk(ilb).gt.2) then
          fun=-1
          call funnam(ids(1,pt+1),'bezout',ilb)
          return
index e7ab07e..1a295ae 100644 (file)
@@ -27,7 +27,7 @@ V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
 V_int = int32(V);
 [thegcd, U] = gcd(V);
 [thegcd, U_int] = gcd(V);
-assert_checkequal(V*U, [0 0 36]);
+assert_checkequal(V*U, int32([0 0 36]));
 assert_checkequal(V_int*U_int, int32([0 0 36]));
 assert_checkequal(gcd(uint8([15 20])), uint8(5));
 assert_checkequal(gcd([iconvert(15, 4) iconvert(20, 4)]), int32(5));
@@ -46,7 +46,7 @@ assert_checkequal(pp, [2*s^2 + 5*s^3 + 4*s^4 + s^5]);
 // Normal behavior, with integers
 V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
 V_int = int32(V);
-assert_checkequal(lcm(V), 9720);
+assert_checkequal(lcm(V), int32(9720));
 assert_checkequal(lcm(V_int), int32(9720));
 // Trying to use booleans, strings or decimals should yield an error
 refMsg4 = msprintf(_("%s: Wrong type for argument #%d: Integer array or Polynomial expected.\n"), "lcm", 1);
index fbefa58..88f98dd 100644 (file)
@@ -30,7 +30,7 @@ V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
 V_int = int32(V);
 [thegcd, U] = gcd(V);
 [thegcd, U_int] = gcd(V);
-assert_checkequal(V*U, [0 0 36]);
+assert_checkequal(V*U, int32([0 0 36]));
 assert_checkequal(V_int*U_int, int32([0 0 36]));
 assert_checkequal(gcd(uint8([15 20])), uint8(5));
 assert_checkequal(gcd([iconvert(15, 4) iconvert(20, 4)]), int32(5));
@@ -52,7 +52,7 @@ assert_checkequal(pp, [2*s^2 + 5*s^3 + 4*s^4 + s^5]);
 // Normal behavior, with integers
 V = [2^2*3^5 2^3*3^2 2^2*3^4*5];
 V_int = int32(V);
-assert_checkequal(lcm(V), 9720);
+assert_checkequal(lcm(V), int32(9720));
 assert_checkequal(lcm(V_int), int32(9720));
 // Trying to use booleans, strings or decimals should yield an error
 refMsg4 = msprintf(_("%s: Wrong type for argument #%d: Integer array or Polynomial expected.\n"), "lcm", 1);
diff --git a/scilab/modules/polynomials/tests/nonreg_tests/bug_13511.dia.ref b/scilab/modules/polynomials/tests/nonreg_tests/bug_13511.dia.ref
deleted file mode 100644 (file)
index dee3450..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLI SHELL MODE -->
-//
-// <-- Non-regression test for bug 13511 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=13511
-//
-// <-- Short Description -->
-// lcm yield incorrect results when used with doubles.
-assert_checkequal(lcm([96 6250 10000 18700]), 56100000);
diff --git a/scilab/modules/polynomials/tests/nonreg_tests/bug_13511.tst b/scilab/modules/polynomials/tests/nonreg_tests/bug_13511.tst
deleted file mode 100644 (file)
index 94c81a6..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// <-- CLI SHELL MODE -->
-//
-// <-- Non-regression test for bug 13511 -->
-//
-// <-- Bugzilla URL -->
-// http://bugzilla.scilab.org/show_bug.cgi?id=13511
-//
-// <-- Short Description -->
-// lcm yield incorrect results when used with doubles.
-
-assert_checkequal(lcm([96 6250 10000 18700]), 56100000);