Macaulay2 Engine
Loading...
Searching...
No Matches

◆ wedge_product()

Matrix * Matrix::wedge_product ( int p,
int q,
const FreeModule * F )
static

Definition at line 1272 of file matrix.cpp.

1273{
1274 const FreeModule *Fp = F->exterior(p);
1275 const FreeModule *Fq = F->exterior(q);
1276 const FreeModule *Fn = F->exterior(p + q);
1277 const FreeModule *G = Fp->tensor(Fq);
1278 const Ring *R = F->get_ring();
1279
1280 MatrixConstructor mat(Fn, G, nullptr);
1281
1282 if (p < 0 || q < 0 || p + q > F->rank()) return mat.to_matrix();
1283
1284 if (p == 0 || q == 0)
1285 {
1286 for (int i = 0; i < G->rank(); i++) mat.set_entry(i, i, R->one());
1287 return mat.to_matrix();
1288 }
1289
1290 Subsets C(F->rank(), p + q);
1291 Subset a(p, 0);
1292 Subset b(q, 0);
1293 Subset c(p + q, 0);
1294 int col = 0;
1295
1296 for (int i = 0; i < Fp->rank(); i++)
1297 {
1298 C.decode(i, a);
1299 for (int j = 0; j < Fq->rank(); j++)
1300 {
1301 C.decode(j, b);
1302 int sgn = Subsets::concatenateSubsets(a, b, c);
1303 if (sgn == 0)
1304 {
1305 col++;
1306 continue;
1307 }
1308 ring_elem r = R->from_long(sgn);
1309 int row = static_cast<int>(C.encode(c));
1310 mat.set_entry(row, col++, r);
1311 }
1312 }
1313 return mat.to_matrix();
1314}
FreeModule * tensor(const FreeModule *G) const
Definition freemod.cpp:271
const Ring * get_ring() const
Definition freemod.hpp:102
FreeModule * exterior(int p) const
Definition freemod.cpp:296
int rank() const
Definition freemod.hpp:105
friend class FreeModule
Definition matrix.hpp:73
friend class MatrixConstructor
Definition matrix.hpp:76
ring_elem one() const
Definition ring.hpp:357
virtual ring_elem from_long(long n) const =0
static int concatenateSubsets(const Subset &s, const Subset &t, Subset &result)
Definition comb.cpp:163
std::vector< size_t > Subset
Definition comb.hpp:58
int p
int sgn(const mpreal &op)
Definition mpreal.h:2781
tbb::flow::graph G

References Subsets::concatenateSubsets(), Subsets::decode(), Subsets::encode(), FreeModule::exterior(), FreeModule, Ring::from_long(), G, FreeModule::get_ring(), Matrix(), MatrixConstructor, Ring::one(), p, FreeModule::rank(), MatrixConstructor::set_entry(), FreeModule::tensor(), MatrixConstructor::to_matrix(), and wedge_product().

Referenced by wedge_product().