From 3011632e061b6d2a9333f8618662c41e55237ecb Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Tue, 14 Mar 2000 19:39:00 +0000 Subject: [PATCH] - Cleanup and clarifications. - Addition of sparse expression trees (to be used at a later stage). --- check/exam_lsolve.cpp | 2 +- check/genex.cpp | 79 ++++++++++++++++++++++++++++++++++++-- check/time_toeplitz.cpp | 3 +- check/time_vandermonde.cpp | 6 ++- 4 files changed, 83 insertions(+), 7 deletions(-) diff --git a/check/exam_lsolve.cpp b/check/exam_lsolve.cpp index dfa71da2..bcbc25fe 100644 --- a/check/exam_lsolve.cpp +++ b/check/exam_lsolve.cpp @@ -98,7 +98,7 @@ static unsigned exam_lsolve2b(void) static unsigned exam_lsolve2c(void) { - // An example from the Maple online help. + // A more interesting example from the Maple online help. unsigned result = 0; symbol x("x"), y("y"); lst eqns, vars; diff --git a/check/genex.cpp b/check/genex.cpp index 77ea18fd..eabfa122 100644 --- a/check/genex.cpp +++ b/check/genex.cpp @@ -1,7 +1,7 @@ /** @file genex.cpp * - * Provides some routines for generating expressions that are later used as input - * in the consistency checks. */ + * Provides some routines for generating expressions that are later used as + * input in the consistency checks. */ /* * GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany @@ -44,7 +44,8 @@ dense_univariate_poly(const symbol & x, unsigned degree) } /* Create a dense bivariate random polynomial in x1 and x2. - * (of the form 9 + 52*x1 - 27*x1^2 + 84*x2 + 7*x2^2 - 12*x1*x2 if degree ==2) */ + * (of the form 9 + 52*x1 - 27*x1^2 + 84*x2 + 7*x2^2 - 12*x1*x2 if degree==2) + */ const ex dense_bivariate_poly(const symbol & x1, const symbol & x2, unsigned degree) { @@ -56,3 +57,75 @@ dense_bivariate_poly(const symbol & x1, const symbol & x2, unsigned degree) return bipoly; } + +const ex +random_symbol(const symbol & x, + const symbol & y, + const symbol & z, + bool rational = true) +{ + ex e; + switch (abs(rand()) % 4) { + case 0: + e = x; + break; + case 1: + e = y; + break; + case 2: + e = z; + break; + case 3: { + int c1 = rand() % 20 - 10; + int c2 = rand() % 20 - 10; + if (c1 == 0) c1 = 1; + if (c2 == 0) c2 = 1; + if (!rational) + c2 = 1; + e = numeric(c1) / numeric(c2); + break; + } + } + return e; +} + +/* Create a sparse random tree in three symbols. */ +const ex +sparse_tree(const symbol & x, + const symbol & y, + const symbol & z, + int level, + bool trig = false, // true includes trigonomatric functions + bool rational = true) // false includes coefficients in Q +{ + if (level == 0) + return random_symbol(x,y,z,rational); + switch (abs(rand()) % 7) { + case 0: + case 1: + return add(sparse_tree(x,y,z,level-1, trig, rational), + sparse_tree(x,y,z,level-1, trig, rational)); + case 2: + case 3: + return mul(sparse_tree(x,y,z,level-1, trig, rational), + sparse_tree(x,y,z,level-1, trig, rational)); + case 4: + case 5: + return power(sparse_tree(x,y,z,level-1, trig, rational), + abs(rand() % 4)); + case 6: + if (trig) { + switch (abs(rand()) % 4) { + case 0: + return sin(sparse_tree(x,y,z,level-1, trig, rational)); + case 1: + return cos(sparse_tree(x,y,z,level-1, trig, rational)); + case 2: + return exp(sparse_tree(x,y,z,level-1, trig, rational)); + case 3: + return log(sparse_tree(x,y,z,level-1, trig, rational)); + } + } else + return random_symbol(x,y,z,rational); + } +} diff --git a/check/time_toeplitz.cpp b/check/time_toeplitz.cpp index 6f138d3e..8390ea26 100644 --- a/check/time_toeplitz.cpp +++ b/check/time_toeplitz.cpp @@ -41,11 +41,12 @@ static unsigned toeplitz_det(unsigned size) // construct Toeplitz matrix: matrix M(size,size); - for (unsigned ro=0; ro