fkt_package< V > Struct Template Reference

#include <fkt_transform.hpp>

List of all members.

Public Types

Static Public Member Functions


Detailed Description

template<typename V>
struct mmx::fkt_package< V >

Definition at line 21 of file fkt_transform.hpp.


Member Typedef Documentation

typedef implementation<polynomial_multiply,V> Pol

Definition at line 22 of file fkt_transform.hpp.

typedef Pol::Vec Vec

Definition at line 23 of file fkt_transform.hpp.


Member Function Documentation

static void direct_fkt ( C dest,
nat  n2,
nat  n3 
) [inline, static]

Definition at line 35 of file fkt_transform.hpp.

References mmx::C, and fkt_package< V >::direct_fkt_step().

00035                                      {
00036   // dest of length n2 = 2^p on entry and n3 = 3^p on exit
00037   if (n2 == 2) {
00038     dest[2]= dest[1];
00039     dest[1] += dest[0];
00040   }
00041   else if (n2 == 4) {
00042     C p= dest[0] + dest[1];
00043     C q= dest[2] + dest[3];
00044     dest[6]= dest[2];
00045     dest[2]= dest[1];
00046     dest[8]= dest[3];
00047     dest[1]= p;
00048     dest[3]= dest[0] + dest[6];
00049     dest[4]= p+q;
00050     dest[5]= dest[2] + dest[8];
00051     dest[7]= q;
00052   }
00053   else while (n2 != n3) {
00054     direct_fkt_step (dest, n2);
00055     n2= n2 + (n2 >> 1);
00056   }
00057 }

static void direct_fkt_step ( C dest,
nat  n 
) [inline, static]

Definition at line 26 of file fkt_transform.hpp.

Referenced by fkt_package< V >::direct_fkt().

00026                                  {
00027   // dest of length n on entry and 3n/2 on exit
00028   nat h= n >> 1;
00029   Vec::half_copy (dest + n, dest + 1, h);
00030   Vec::half_copy (dest + 1, dest + 2, h - 1);
00031   Pol::add (dest + h, dest, dest + n, h);
00032 }

static void inverse_fkt ( C dest,
nat  n3,
nat  n2 
) [inline, static]

Definition at line 86 of file fkt_transform.hpp.

References mmx::C, and fkt_package< V >::inverse_fkt_step().

00086                                       {
00087   // dest of length n3 = 3^p on entry and 2 n2 - 1 on exit with n2 = 2 ^ p
00088   if (n2 == 2)
00089     dest[1] -= (dest[0] + dest[2]);
00090   else if (n2 == 4) {
00091     dest[3] -= (dest[0] + dest[6]);
00092     dest[4] -= (dest[1] + dest[7]);
00093     dest[5] -= (dest[2] + dest[8]);
00094     C aux= dest[1]; dest[1]= dest[3]; dest[3]= aux;
00095     aux= dest[2]; dest[2]= dest[6]; dest[6]= aux;
00096     aux= dest[5]; dest[5]= dest[7]; dest[7]= aux;
00097     dest[3] -= (dest[0] + dest[6]);
00098     dest[4] -= (dest[1] + dest[7]);
00099     dest[5] -= (dest[2] + dest[8]);
00100     aux= dest[1];
00101     dest[1]= dest[3];
00102     dest[3]= dest[4];
00103     dest[4]= dest[2] + dest[7];
00104     dest[2]= aux + dest[6];
00105     dest[6]= dest[8];
00106   }
00107   else {
00108     nat n= n3, l= 1;
00109     while (n != l) {
00110       inverse_fkt_step (dest, n, l);
00111       nat k= n / ((l << 1) + l);
00112       l= (l << 1) + 1;
00113       n= k * l;
00114     }
00115   }
00116 }

static void inverse_fkt_step ( C dest,
nat  n,
nat  l 
) [inline, static]

Definition at line 60 of file fkt_transform.hpp.

References mmx::C, and mmx::copy().

Referenced by fkt_package< V >::inverse_fkt().

00060                                          {
00061   // dest of length n = 3 k l on entry for some integer k
00062   // dest of length (2 l + 1) k on exit
00063   nat t= n/3, k= t/l, ll= (l << 1) + 1;
00064   Pol::sub (dest + t, dest, t);
00065   Pol::sub (dest + t, dest + (t << 1), t);
00066   nat buf_size= aligned_size<C,V> (n);
00067   C* buf= mmx_new<C> (buf_size);
00068   Pol::copy (buf, dest, n);
00069   C* src= buf;
00070   if (l == 1) {
00071     Vec::triple_copy (dest, buf, t);
00072     Vec::triple_copy (dest + 1, buf + t, t);
00073     Vec::triple_copy (dest + 2, buf + (t << 1), t);
00074   }
00075   else while (k != 0) {
00076     Vec::double_copy (dest, src, l);
00077     Vec::double_copy (dest + 1, src + t, l);
00078     Vec::double_add (dest + 2, src + (t << 1), l-1);
00079     dest[l<<1]= src[(t<<1) + (l-1)];
00080     dest += ll; src += l; k--;
00081   }
00082   mmx_delete<C> (buf, buf_size);
00083 }


The documentation for this struct was generated from the following file:

Generated on 20 Mar 2013 for algebramix by  doxygen 1.6.1