121 #include "type_parite.h" 140 Matrice _cl_pas_prevu (
const Matrice &source,
int l,
double echelle,
int puis) {
141 cout <<
"Combinaison lineaire pas prevu..." << endl ;
142 cout <<
"Source : " << source << endl ;
143 cout <<
"l : " << l << endl ;
144 cout <<
"dzpuis : " << puis << endl ;
145 cout <<
"Echelle : " << echelle << endl ;
156 Matrice _cl_r_cheb (
const Matrice &source,
int l,
double echelle,
int) {
157 int n = source.
get_dim(0) ;assert (n == source.get_dim(1)) ;
160 const int nmax = 200 ;
161 static Matrice* tab[nmax] ;
162 static int nb_dejafait = 0 ;
163 static int l_dejafait[nmax] ;
164 static int nr_dejafait[nmax] ;
165 static double vieux_echelle = 0 ;
168 if (vieux_echelle != echelle) {
169 for (
int i=0 ; i<nb_dejafait ; i++) {
171 nr_dejafait[i] = -1 ;
175 vieux_echelle = echelle ;
181 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
182 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
187 if (nb_dejafait >= nmax) {
188 cout <<
"_cl_r_cheb : trop de matrices" << endl ;
193 l_dejafait[nb_dejafait] = l ;
194 nr_dejafait[nb_dejafait] = n ;
196 Matrice barre(source) ;
198 for (
int i=0 ; i<n-2 ; i++) {
199 for (
int j=i ; j<(n>(i+7)? i+7 : n) ; j++)
200 barre.set(i, j) = ((1+dirac)*source(i, j)-source(i+2, j))
202 if (i==0) dirac = 0 ;
206 for (
int i=0 ; i<n-4 ; i++)
207 for (
int j=i ; j<(n>(i+5)? i+5 : n) ; j++)
208 res.set(i, j) = barre(i, j)-barre(i+2, j) ;
209 tab[nb_dejafait] =
new Matrice(res) ;
216 return *tab[indice] ;
224 Matrice _cl_r_jaco02 (
const Matrice &source,
int l,
double echelle,
int) {
225 int n = source.
get_dim(0) ;assert (n == source.get_dim(1)) ;
228 const int nmax = 200 ;
229 static Matrice* tab[nmax] ;
230 static int nb_dejafait = 0 ;
231 static int l_dejafait[nmax] ;
232 static int nr_dejafait[nmax] ;
233 static double vieux_echelle = 0 ;
236 if (vieux_echelle != echelle) {
237 for (
int i=0 ; i<nb_dejafait ; i++) {
239 nr_dejafait[i] = -1 ;
243 vieux_echelle = echelle ;
249 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
250 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
255 if (nb_dejafait >= nmax) {
256 cout <<
"_cl_r_jaco02 : trop de matrices" << endl ;
261 l_dejafait[nb_dejafait] = l ;
262 nr_dejafait[nb_dejafait] = n ;
264 Matrice barre(source) ;
265 for (
int i=0 ; i<n ; i++) {
266 for (
int j=i ; j<n ; j++)
267 barre.set(i, j) = source(i, j) ;
271 for (
int i=0 ; i<n ; i++)
272 for (
int j=i ; j<n ; j++)
273 res.set(i, j) = barre(i, j);
274 tab[nb_dejafait] =
new Matrice(res) ;
281 return *tab[indice] ;
290 Matrice _cl_r_chebp (
const Matrice &source,
int l,
double,
int) {
293 assert (n == source.get_dim(1)) ;
295 const int nmax = 200 ;
296 static Matrice* tab[nmax] ;
297 static int nb_dejafait = 0 ;
298 static int l_dejafait[nmax] ;
299 static int nr_dejafait[nmax] ;
304 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
305 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
310 if (nb_dejafait >= nmax) {
311 cout <<
"_cl_r_chebp : trop de matrices" << endl ;
316 l_dejafait[nb_dejafait] = l ;
317 nr_dejafait[nb_dejafait] = n ;
319 Matrice barre(source) ;
322 for (
int i=0 ; i<n-2 ; i++) {
323 for (
int j=0 ; j<n ; j++)
324 barre.set(i, j) = (1+dirac)*source(i, j)-source(i+2, j) ;
325 if (i==0) dirac = 0 ;
328 Matrice tilde(barre) ;
329 for (
int i=0 ; i<n-4 ; i++)
330 for (
int j=0 ; j<n ; j++)
331 tilde.set(i, j) = barre(i, j)-barre(i+2, j) ;
334 for (
int i=0 ; i<n-4 ; i++)
335 for (
int j=0 ; j<n ; j++)
336 res.set(i, j) = tilde(i, j)-tilde(i+1, j) ;
337 tab[nb_dejafait] =
new Matrice(res) ;
344 return *tab[indice] ;
352 Matrice _cl_r_chebi (
const Matrice &source,
int l,
double,
int) {
354 assert (n == source.get_dim(1)) ;
357 const int nmax = 200 ;
358 static Matrice* tab[nmax] ;
359 static int nb_dejafait = 0 ;
360 static int l_dejafait[nmax] ;
361 static int nr_dejafait[nmax] ;
366 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
367 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
372 if (nb_dejafait >= nmax) {
373 cout <<
"_cl_r_chebi : trop de matrices" << endl ;
378 l_dejafait[nb_dejafait] = l ;
379 nr_dejafait[nb_dejafait] = n ;
381 Matrice barre(source) ;
383 for (
int i=0 ; i<n-2 ; i++)
384 for (
int j=0 ; j<n ; j++)
385 barre.set(i, j) = source(i, j)-source(i+2, j) ;
387 Matrice tilde(barre) ;
388 for (
int i=0 ; i<n-4 ; i++)
389 for (
int j=0 ; j<n ; j++)
390 tilde.set(i, j) = barre(i, j)-barre(i+2, j) ;
393 for (
int i=0 ; i<n-4 ; i++)
394 for (
int j=0 ; j<n ; j++)
395 res.set(i, j) = tilde(i, j)-tilde(i+1, j) ;
396 tab[nb_dejafait] =
new Matrice(res) ;
403 return *tab[indice] ;
409 Matrice _cl_r_chebu (
const Matrice &source,
int l,
double,
int puis) {
411 assert (n == source.get_dim(1)) ;
418 res = _cl_r_chebu_cinq(source, l) ;
421 res = _cl_r_chebu_quatre(source, l) ;
424 res = _cl_r_chebu_trois (source, l) ;
427 res = _cl_r_chebu_deux(source, l) ;
439 Matrice _cl_r_chebu_quatre (
const Matrice &source,
int l) {
441 assert (n == source.get_dim(1)) ;
444 const int nmax = 200 ;
445 static Matrice* tab[nmax] ;
446 static int nb_dejafait = 0 ;
447 static int l_dejafait[nmax] ;
448 static int nr_dejafait[nmax] ;
453 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
454 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
459 if (nb_dejafait >= nmax) {
460 cout <<
"_cl_r_chebu_quatre : trop de matrices" << endl ;
465 l_dejafait[nb_dejafait] = l ;
466 nr_dejafait[nb_dejafait] = n ;
468 Matrice barre(source) ;
471 for (
int i=0 ; i<n-2 ; i++) {
472 for (
int j=0 ; j<n ; j++)
473 barre.set(i, j) = ((1+dirac)*source(i, j)-source(i+2, j)) ;
474 if (i==0) dirac = 0 ;
477 Matrice tilde(barre) ;
478 for (
int i=0 ; i<n-4 ; i++)
479 for (
int j=0 ; j<n ; j++)
480 tilde.set(i, j) = (barre(i, j)-barre(i+2, j)) ;
482 Matrice prime(tilde) ;
483 for (
int i=0 ; i<n-4 ; i++)
484 for (
int j=0 ; j<n ; j++)
485 prime.set(i, j) = (tilde(i, j)-tilde(i+1, j)) ;
488 for (
int i=0 ; i<n-4 ; i++)
489 for (
int j=0 ; j<n ; j++)
490 res.set(i, j) = (prime(i, j)-prime(i+2, j)) ;
491 tab[nb_dejafait] =
new Matrice(res) ;
498 return *tab[indice] ;
502 Matrice _cl_r_chebu_trois (
const Matrice &source,
int l) {
504 assert (n == source.get_dim(1)) ;
507 const int nmax = 200 ;
508 static Matrice* tab[nmax] ;
509 static int nb_dejafait = 0 ;
510 static int l_dejafait[nmax] ;
511 static int nr_dejafait[nmax] ;
516 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
517 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
522 if (nb_dejafait >= nmax) {
523 cout <<
"_cl_r_chebu_trois : trop de matrices" << endl ;
528 l_dejafait[nb_dejafait] = l ;
529 nr_dejafait[nb_dejafait] = n ;
531 Matrice barre(source) ;
534 for (
int i=0 ; i<n-2 ; i++) {
535 for (
int j=0 ; j<n ; j++)
536 barre.set(i, j) = ((1+dirac)*source(i, j)-source(i+2, j)) ;
537 if (i==0) dirac = 0 ;
540 Matrice tilde(barre) ;
541 for (
int i=0 ; i<n-4 ; i++)
542 for (
int j=0 ; j<n ; j++)
543 tilde.set(i, j) = (barre(i, j)-barre(i+2, j)) ;
546 for (
int i=0 ; i<n-4 ; i++)
547 for (
int j=0 ; j<n ; j++)
548 res.set(i, j) = (tilde(i, j)+tilde(i+1, j)) ;
550 tab[nb_dejafait] =
new Matrice(res) ;
557 return *tab[indice] ;
562 Matrice _cl_r_chebu_deux (
const Matrice &source,
int l) {
564 assert (n == source.get_dim(1)) ;
567 const int nmax = 200 ;
568 static Matrice* tab[nmax] ;
569 static int nb_dejafait = 0 ;
570 static int l_dejafait[nmax] ;
571 static int nr_dejafait[nmax] ;
576 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
577 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
582 if (nb_dejafait >= nmax) {
583 cout <<
"_cl_r_chebu_deux : trop de matrices" << endl ;
588 l_dejafait[nb_dejafait] = l ;
589 nr_dejafait[nb_dejafait] = n ;
591 Matrice barre(source) ;
594 for (
int i=0 ; i<n-2 ; i++) {
595 for (
int j=0 ; j<n ; j++)
596 barre.set(i, j) = ((1+dirac)*source(i, j)-source(i+2, j)) ;
597 if (i==0) dirac = 0 ;
600 Matrice tilde(barre) ;
601 for (
int i=0 ; i<n-4 ; i++)
602 for (
int j=0 ; j<n ; j++)
603 tilde.set(i, j) = (barre(i, j)-barre(i+2, j)) ;
606 for (
int i=0 ; i<n-4 ; i++)
607 for (
int j=0 ; j<n ; j++)
608 res.set(i, j) = (tilde(i, j)+tilde(i+1, j)) ;
615 return *tab[indice] ;
620 Matrice _cl_r_chebu_cinq (
const Matrice &source,
int l) {
622 assert (n == source.get_dim(1)) ;
625 const int nmax = 200 ;
626 static Matrice* tab[nmax] ;
627 static int nb_dejafait = 0 ;
628 static int l_dejafait[nmax] ;
629 static int nr_dejafait[nmax] ;
634 for (
int conte=0 ; conte<nb_dejafait ; conte ++)
635 if ((l_dejafait[conte] == l) && (nr_dejafait[conte] == n))
640 if (nb_dejafait >= nmax) {
641 cout <<
"_cl_r_chebu_cinq : trop de matrices" << endl ;
646 l_dejafait[nb_dejafait] = l ;
647 nr_dejafait[nb_dejafait] = n ;
649 Matrice barre(source) ;
652 for (
int i=0 ; i<n-2 ; i++) {
653 for (
int j=0 ; j<n ; j++)
654 barre.set(i, j) = ((1+dirac)*source(i, j)-source(i+2, j)) ;
655 if (i==0) dirac = 0 ;
658 Matrice tilde(barre) ;
659 for (
int i=0 ; i<n-4 ; i++)
660 for (
int j=0 ; j<n ; j++)
661 tilde.set(i, j) = (barre(i, j)-barre(i+2, j)) ;
664 for (
int i=0 ; i<n-4 ; i++)
665 for (
int j=0 ; j<n ; j++)
666 res.set(i, j) = (tilde(i, j)+tilde(i+1, j)) ;
677 return *tab[indice] ;
684 Matrice combinaison (
const Matrice &source,
int l,
double echelle,
int puis,
int base_r) {
687 static Matrice (*combinaison[
MAX_BASE])(
const Matrice &, int, double, int) ;
694 combinaison[i] = _cl_pas_prevu ;
704 Matrice res(combinaison[base_r](source, l, echelle, puis)) ;
713 Tbl _cl_pas_prevu (
const Tbl &source,
int puis) {
714 cout <<
"Combinaison lineaire pas prevue..." << endl ;
715 cout <<
"source : " << &source << endl ;
716 cout <<
"dzpuis : " << puis << endl ;
728 Tbl _cl_r_cheb (
const Tbl &source,
int) {
730 int n = source.get_dim(0) ;
733 for (
int i=0 ; i<n-2 ; i++) {
734 barre.set(i) = ((1+dirac)*source(i)-source(i+2))
736 if (i==0) dirac = 0 ;
740 for (
int i=0 ; i<n-4 ; i++)
741 res.set(i) = barre(i)-barre(i+2) ;
750 Tbl _cl_r_jaco02 (
const Tbl &source,
int) {
752 int n = source.get_dim(0) ;
754 for (
int i=0 ; i<n ; i++) {
755 barre.set(i) = source(i) ;
759 for (
int i=0 ; i<n ; i++)
760 res.set(i) = barre(i);
769 Tbl _cl_r_chebp (
const Tbl &source,
int) {
771 int n = source.get_dim(0) ;
774 for (
int i=0 ; i<n-2 ; i++) {
775 barre.set(i) = (1+dirac)*source(i)-source(i+2) ;
776 if (i==0) dirac = 0 ;
780 for (
int i=0 ; i<n-4 ; i++)
781 tilde.set(i) = barre(i)-barre(i+2) ;
784 for (
int i=0 ; i<n-4 ; i++)
785 res.set(i) = tilde(i)-tilde(i+1) ;
795 Tbl _cl_r_chebi (
const Tbl &source,
int) {
797 int n = source.get_dim(0) ;
799 for (
int i=0 ; i<n-2 ; i++)
800 barre.set(i) = source(i)-source(i+2) ;
803 for (
int i=0 ; i<n-4 ; i++)
804 tilde.set(i) = barre(i)-barre(i+2) ;
807 for (
int i=0 ; i<n-4 ; i++)
808 res.set(i) = tilde(i)-tilde(i+1) ;
818 Tbl _cl_r_chebu (
const Tbl &source,
int puis) {
826 res = _cl_r_chebu_cinq(source) ;
829 res = _cl_r_chebu_quatre(source) ;
832 res = _cl_r_chebu_trois (source) ;
835 res = _cl_r_chebu_deux(source) ;
846 Tbl _cl_r_chebu_quatre (
const Tbl &source) {
848 int n = source.get_dim(0) ;
851 for (
int i=0 ; i<n-2 ; i++) {
852 barre.set(i) = ((1+dirac)*source(i)-source(i+2)) ;
853 if (i==0) dirac = 0 ;
857 for (
int i=0 ; i<n-4 ; i++)
858 tilde.set(i) = (barre(i)-barre(i+2)) ;
861 for (
int i=0 ; i<n-4 ; i++)
862 prime.set(i) = (tilde(i)-tilde(i+1)) ;
865 for (
int i=0 ; i<n-4 ; i++)
866 res.set(i) = (prime(i)-prime(i+2)) ;
871 Tbl _cl_r_chebu_trois (
const Tbl &source) {
873 int n = source.get_dim(0) ;
876 for (
int i=0 ; i<n-2 ; i++) {
877 barre.set(i) = ((1+dirac)*source(i)-source(i+2)) ;
878 if (i==0) dirac = 0 ;
882 for (
int i=0 ; i<n-4 ; i++)
883 tilde.set(i) = (barre(i)-barre(i+2)) ;
886 for (
int i=0 ; i<n-4 ; i++)
887 res.set(i) = (tilde(i)+tilde(i+1)) ;
893 Tbl _cl_r_chebu_deux (
const Tbl &source) {
895 int n = source.get_dim(0) ;
898 for (
int i=0 ; i<n-2 ; i++) {
899 barre.set(i) = ((1+dirac)*source(i)-source(i+2)) ;
900 if (i==0) dirac = 0 ;
904 for (
int i=0 ; i<n-4 ; i++)
905 tilde.set(i) = (barre(i)-barre(i+2)) ;
908 for (
int i=0 ; i<n-4 ; i++)
909 res.set(i) = (tilde(i)+tilde(i+1)) ;
914 Tbl _cl_r_chebu_cinq (
const Tbl &source) {
916 int n = source.get_dim(0) ;
919 for (
int i=0 ; i<n-2 ; i++) {
920 barre.set(i) = ((1+dirac)*source(i)-source(i+2)) ;
921 if (i==0) dirac = 0 ;
925 for (
int i=0 ; i<n-4 ; i++)
926 tilde.set(i) = (barre(i)-barre(i+2)) ;
929 for (
int i=0 ; i<n-4 ; i++)
930 res.set(i) = (tilde(i)+tilde(i+1)) ;
939 Tbl combinaison (
const Tbl &source,
int puis,
int base_r) {
942 static Tbl (*combinaison[
MAX_BASE])(
const Tbl &, int) ;
949 combinaison[i] = _cl_pas_prevu ;
959 Tbl res(combinaison[base_r](source, puis)) ;
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
int get_dim(int i) const
Returns the dimension of the matrix.
#define R_CHEBU
base de Chebychev ordinaire (fin), dev. en 1/r
#define MAX_BASE
Nombre max. de bases differentes.
#define R_CHEB
base de Chebychev ordinaire (fin)