Bug #8493 fixed - simp(p1,p2) did nothing for complex-encoded polys 20/18420/3
Samuel GOUGEON [Mon, 8 Aug 2016 05:36:22 +0000 (07:36 +0200)]
 http://bugzilla.scilab.org/8493

Change-Id: I45b6d1ba343e1ffbd17fb36e00f4723291f0cd23

scilab/CHANGES.md
scilab/modules/polynomials/macros/%p_d_p.sci [moved from scilab/modules/overloading/macros/%p_d_p.sci with 100% similarity]
scilab/modules/polynomials/macros/%p_r_p.sci
scilab/modules/polynomials/macros/%p_simp.sci
scilab/modules/polynomials/tests/nonreg_tests/bug_8493.dia.ref [new file with mode: 0644]
scilab/modules/polynomials/tests/nonreg_tests/bug_8493.tst [new file with mode: 0644]

index 26dbbe6..71e2efa 100644 (file)
@@ -250,6 +250,7 @@ Bug Fixes
 * [Bug #7649](http://bugzilla.scilab.org/show_bug.cgi?id=7649) fixed - `isempty` returned `%F` on `struct()`, `{}` or `list(,)` and was not shortcut
 * [Bug #7696](http://bugzilla.scilab.org/show_bug.cgi?id=7696) fixed   - The `parallel_run` help page was poorly formated
 * [Bug #8356](http://bugzilla.scilab.org/show_bug.cgi?id=8356) fixed - `sci2exp` applied to lists, tlists or mlists having undefined fields yielded an error or a wrong result.
+* [Bug #8493](http://bugzilla.scilab.org/show_bug.cgi?id=8493) fixed - Some trivial simplifications of `p1./p2` with matrices of complex-encoded polynomials were not done.
 * [Bug #9912](http://bugzilla.scilab.org/show_bug.cgi?id=9912) fixed   - In case of missing translated help page, the default en_US was sometimes ignored
 * [Bug #9153](http://bugzilla.scilab.org/9153) fixed                   - The `isqualbitwise` help page was inaccurate and badly located
 * [Bug #11375](http://bugzilla.scilab.org/show_bug.cgi?id=11375) fixed - When a localized help subdirectory has only a CHAPTER file specifying the section title, it was ignored.
index a4e045c..8a749d9 100644 (file)
@@ -1,5 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function f=%p_r_p(p1,p2)
-    // f=%p_r_p(p1,p2) <=> f= p1*(p2^(-1))
-    //p1 polynomial matrix
-    //p2 polynomial matrix
-    //!
+function f = %p_r_p(p1,p2)
+    // f = %p_r_p(p1,p2) <=> f= p1*(p2^(-1))
+    //p1 : single polynomial or matrix of polynomials
+    //p2 : polynomial scalar or matrix
 
-    [l,c]=size(p2)
-    if l*c <>1 then f=p1*invr(p2),return,end
-    [l,c]=size(p1)
-    [p1 p2]=simp(p1,p2*ones(l,c))
-    f=rlist(p1,p2,[])
+    [l,c] = size(p2)
+    if l*c <>1 then
+        f = p1*invr(p2)
+    else
+        f = %p_d_p(p1, p2)   //   p1./p2
+    end
 endfunction
index a2369e0..d370b70 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
+// Copyright (C) 2016 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function [num,den]=%p_simp(num,den)
-    // implement complex case
+function [num, den] = %p_simp(num, den)
+    // Called when num or/and den are complex-encoded
+
+    // Special cases when real or imaginary parts are both null:
+    // http://bugzilla.scilab.org/8493
+    if ~isreal(num)
+        if imag(num)==0 then
+            num = real(num)
+        else
+        end
+    end
+    if ~isreal(den)
+        if imag(den)==0 then
+            den = real(den)
+        else
+        end
+    end
+    // Case of both real null parts
+    if ~isreal(num) && real(num)==0 && ~isreal(den) && real(den)==0 then
+        num = imag(num)
+        den = imag(den)
+    end
+    if isreal(num) && isreal(den) then
+        [num, den] = simp(num, den)
+    end
 endfunction
diff --git a/scilab/modules/polynomials/tests/nonreg_tests/bug_8493.dia.ref b/scilab/modules/polynomials/tests/nonreg_tests/bug_8493.dia.ref
new file mode 100644 (file)
index 0000000..082cda8
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 8493 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/8493
+//
+// <-- Short Description -->
+// Dividing p1./p2 with p1 or/and p2 complex-encoded polynomials with null
+// real or imaginary parts for both p1 and p2 prevented some simplifications
+
+z = %z;
+// With scalar polynomials
+assert_checkequal(((1+0*%i)*z^2+z^3+z^4) ./ z^2, rlist(1+z+z^2, 1));
+assert_checkequal(((1+0*%i)*z^2+z^3+z^4) / z^2, rlist(1+z+z^2, 1));
+assert_checkequal((%i*z^2+%i*z^3+%i*z^4) ./ (%i*z^2), rlist(1+z+z^2, 1));
+assert_checkequal((%i*z^2+%i*z^3+%i*z^4) / (%i*z^2), rlist(1+z+z^2, 1));
+
+// With matrices of polynomials
+p1 = ((1+0*%i)*z^2+z^3+z^4); p1 = [p1 p1];
+r = rlist(1+z+z^2, 1); r = [r r];
+assert_checkequal(p1 ./ z^2, r);
+p1 = (%i*z^2+%i*z^3+%i*z^4) ; p1 = [p1 p1];
+assert_checkequal(p1 ./ (%i*z^2), r);
diff --git a/scilab/modules/polynomials/tests/nonreg_tests/bug_8493.tst b/scilab/modules/polynomials/tests/nonreg_tests/bug_8493.tst
new file mode 100644 (file)
index 0000000..082cda8
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 8493 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/8493
+//
+// <-- Short Description -->
+// Dividing p1./p2 with p1 or/and p2 complex-encoded polynomials with null
+// real or imaginary parts for both p1 and p2 prevented some simplifications
+
+z = %z;
+// With scalar polynomials
+assert_checkequal(((1+0*%i)*z^2+z^3+z^4) ./ z^2, rlist(1+z+z^2, 1));
+assert_checkequal(((1+0*%i)*z^2+z^3+z^4) / z^2, rlist(1+z+z^2, 1));
+assert_checkequal((%i*z^2+%i*z^3+%i*z^4) ./ (%i*z^2), rlist(1+z+z^2, 1));
+assert_checkequal((%i*z^2+%i*z^3+%i*z^4) / (%i*z^2), rlist(1+z+z^2, 1));
+
+// With matrices of polynomials
+p1 = ((1+0*%i)*z^2+z^3+z^4); p1 = [p1 p1];
+r = rlist(1+z+z^2, 1); r = [r r];
+assert_checkequal(p1 ./ z^2, r);
+p1 = (%i*z^2+%i*z^3+%i*z^4) ; p1 = [p1 p1];
+assert_checkequal(p1 ./ (%i*z^2), r);