include/topology/field-arithmetic.h
author Christos Mantoulidis <cmad@stanford.edu>
Tue, 04 Aug 2009 13:23:16 -0700
branchdev
changeset 156 f75fb57d2831
parent 137 069596c71902
child 173 5fd3f43e6fbf
permissions -rw-r--r--
Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.

#ifndef __FIELD_ARITHMETIC_H__
#define __FIELD_ARITHMETIC_H__

#include <vector>
#include <gmpxx.h>

class ZpField
{
    public:
        typedef     int                                             Element;

                    ZpField(Element p = 2);

        Element     id()  const                                     { return 1; }
        Element     zero()  const                                   { return 0; }

        Element     neg(Element a) const                            { return p_ - a; }
        Element     add(Element a, Element b) const                 { return (a+b) % p_; }

        Element     inv(Element a) const                            { return inverses_[a]; }
        Element     mul(Element a, Element b) const                 { return (a*b) % p_; }
        Element     div(Element a, Element b) const                 { return mul(a, inv(b)); }

        bool        is_zero(Element a) const                        { return (a % p_) == 0; }

    private:
        Element                 p_;
        std::vector<Element>    inverses_;
};

ZpField::
ZpField(Element p):
    p_(p), inverses_(p_)
{
    for (Element i = 1; i < p_; ++i)
        for (Element j = 1; j < p_; ++j)
            if (mul(i,j) == 1)
            {
                inverses_[i] = j;
                break;
            }
}

class QField
{
    public:
        typedef     mpq_class                                       Element;

                    QField()                                        {}

        Element     id()  const                                     { return 1; }
        Element     zero()  const                                   { return 0; }

        Element     neg(Element a) const                            { return -a; }
        Element     add(Element a, Element b) const                 { return (a+b); }

        Element     inv(Element a) const                            { return id()/a; }
        Element     mul(Element a, Element b) const                 { return (a*b); }
        Element     div(Element a, Element b) const                 { return a/b; }

        bool        is_zero(Element a) const                        { return a == 0; }
};
 
#endif // __FIELD_ARITHMETIC_H__