* (time_fateman_expand.cpp): new file.
authorRichard Kreckel <Richard.Kreckel@uni-mainz.de>
Thu, 28 Mar 2002 00:13:25 +0000 (00:13 +0000)
committerRichard Kreckel <Richard.Kreckel@uni-mainz.de>
Thu, 28 Mar 2002 00:13:25 +0000 (00:13 +0000)
* (Makefile.am): compile it.
* (times.h, times.cpp): declare and call it.

check/Makefile.am
check/time_fateman_expand.cpp [new file with mode: 0644]
check/times.cpp
check/times.h

index f4406cb..bf25465 100644 (file)
@@ -19,7 +19,8 @@ times_SOURCES = time_dennyfliegner.cpp time_gammaseries.cpp \
   time_lw_C.cpp time_lw_D.cpp time_lw_E.cpp time_lw_F.cpp time_lw_G.cpp \
   time_lw_H.cpp time_lw_IJKL.cpp time_lw_M1.cpp time_lw_M2.cpp time_lw_N.cpp \
   time_lw_O.cpp time_lw_P.cpp time_lw_Pprime.cpp time_lw_Q.cpp \
-  time_lw_Qprime.cpp time_antipode.cpp timer.cpp times.cpp times.h
+  time_lw_Qprime.cpp time_antipode.cpp time_fateman_expand.cpp \
+  timer.cpp times.cpp times.h
 times_LDADD = ../ginac/libginac.la
 
 INCLUDES = -I$(srcdir)/../ginac -I../ginac
diff --git a/check/time_fateman_expand.cpp b/check/time_fateman_expand.cpp
new file mode 100644 (file)
index 0000000..54f2ddf
--- /dev/null
@@ -0,0 +1,72 @@
+/** @file time_fateman_expand.cpp
+ *
+ *  Time for polynomial expansion of (x+y+z+1)^20 * ((x+y+z+1)^20+1).
+ *  This test was suggested by Richard J. Fateman as a benchmark for programs
+ *  to multiply sparse polynomials fast.
+ */
+
+/*
+ *  GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "times.h"
+
+static unsigned test(void)
+{
+       unsigned result = 0;
+       const symbol x("x"), y("y"), z("z");
+
+       const ex p = pow(x+y+z+1, 20);
+
+       const ex hugesum = expand(p * (p+1));
+
+       if (hugesum.nops()!=12341) {
+               clog << "(x+y+z+1)^20 * ((x+y+z+1)^20+1) was miscomputed!" << endl;
+               ++result;
+       }
+
+       return result;
+}
+
+unsigned time_fateman_expand(void)
+{
+       unsigned result = 0;
+       unsigned count = 0;
+       timer concord;
+       double time = .0;
+
+       cout << "timing Fateman's polynomial expand benchmark" << flush;
+       clog << "-------Fateman's polynomial expand benchmark:" << endl;
+
+       concord.start();
+       // correct for very small times:
+       do {
+               result = test();
+               ++count;
+       } while ((time=concord.read())<0.1 && !result);
+       cout << '.' << flush;
+
+       if (!result) {
+               cout << " passed ";
+               clog << "(no output)" << endl;
+       } else {
+               cout << " failed ";
+       }
+       cout << int(1000*(time/count))*0.001 << 's' << endl;
+
+       return result;
+}
index ea9f743..c5dcff7 100644 (file)
@@ -57,6 +57,7 @@ try { \
        TIME(lw_Q)
        TIME(lw_Qprime)
        TIME(antipode)
+       TIME(fateman_expand)
        
        if (result) {
                cout << "Error: something went wrong. ";
index 62ed8f2..fdf6d69 100644 (file)
@@ -69,5 +69,6 @@ unsigned time_lw_Pprime();
 unsigned time_lw_Q();
 unsigned time_lw_Qprime();
 unsigned time_antipode();
+unsigned time_fateman_expand();
 
 #endif // ndef CHECKS_H