Class Coder<Element,​Term extends AMonomial<Term>,​Poly extends AMultivariatePolynomial<Term,​Poly>>

java.lang.Object
cc.redberry.rings.io.Coder<Element,​Term,​Poly>
Type Parameters:
Element - type of resulting elements
Term - underlying polynomial terms
Poly - underlying multivariate polynomials
All Implemented Interfaces:
IParser<Element>, IStringifier<Element>, Serializable

public class Coder<Element,​Term extends AMonomial<Term>,​Poly extends AMultivariatePolynomial<Term,​Poly>>
extends Object
implements IParser<Element>, IStringifier<Element>, Serializable
High-level parser and stringifier of ring elements. Uses shunting-yard algorithm for parsing.
Since:
2.4
See Also:
Serialized Form
  • Field Details

  • Method Details

    • bind

      public Coder<Element,​Term,​Poly> bind​(String var, Element el)
      Add string -> element mapping
    • bindAlias

      public Coder<Element,​Term,​Poly> bindAlias​(String var, Element el)
      Add string -> element mapping
    • bindPolynomialVariable

      public Coder<Element,​Term,​Poly> bindPolynomialVariable​(String var, int index)
      Add string -> element mapping
    • withEncoder

      public Coder<Element,​Term,​Poly> withEncoder​(Coder<?,​?,​?> subencoder)
      Add stringifier of inner elements
    • substringifier

      public <K> IStringifier<K> substringifier​(Ring<K> ring)
      Description copied from interface: IStringifier
      Get stringifier for the specified ring of some underlying elements, should never give null (use dummy() for absent stringifier)
      Specified by:
      substringifier in interface IStringifier<Element>
    • getBindings

      public Map<Element,​String> getBindings()
      Description copied from interface: IStringifier
      Map of bindings
      Specified by:
      getBindings in interface IStringifier<Element>
    • decode

      public Element decode​(String string)
      Decode element from its string representation (#parse)
    • encode

      public String encode​(Element element)
      Encode element to its string representation (#stringify)
    • map

      public <Oth> Coder<Oth,​?,​?> map​(Ring<Oth> ring, Function<Element,​Oth> func)
      Maps this coder to a given type via mapper func which just applies to each parsed element as well as to bindings (for IStringifier.stringify(Object)).
    • mkCoder

      public static <Element,​ Term extends AMonomial<Term>,​ Poly extends AMultivariatePolynomial<Term,​ Poly>> Coder<Element,​Term,​Poly> mkCoder​(Ring<Element> baseRing, Map<String,​Element> eVariables, MultivariateRing<Poly> polyRing, Map<String,​Poly> pVariables, SerializableFunction<Poly,​Element> polyToElement)
      Parameters:
      baseRing - the base ring
      eVariables - variables bindings (variableString -> base ring element)
      polyRing - auxiliary polynomial ring, to manage intermediate polynomial expressions
      pVariables - polynomial variables bindings (variableString -> polyRing variable index)
      polyToElement - convert from auxiliary polynomials to basering
    • mkCoder

      public static <E> Coder<E,​?,​?> mkCoder​(Ring<E> ring)
      Create coder for generic ring
      Parameters:
      ring - the ring
    • mkCoder

      public static <E> Coder<E,​?,​?> mkCoder​(Ring<E> ring, Map<String,​E> variables)
      Create coder for generic rings
      Parameters:
      ring - the ring
      variables - map string_variable -> ring_element
    • mkPolynomialCoder

      public static <Poly extends IPolynomial<Poly>> Coder<Poly,​?,​?> mkPolynomialCoder​(IPolynomialRing<Poly> ring, String... variables)
      Create coder for generic polynomial rings
      Parameters:
      ring - the ring
      variables - variables
    • mkMultipleExtensionCoder

      public static <Term extends AMonomial<Term>,​ mPoly extends AMultivariatePolynomial<Term,​ mPoly>,​ sPoly extends IUnivariatePolynomial<sPoly>> Coder<mPoly,​?,​?> mkMultipleExtensionCoder​(MultipleFieldExtension<Term,​mPoly,​sPoly> field, String... variables)
      Create coder for multiple field extension
      Parameters:
      field - multiple field extension
      variables - string representation of generators
    • mkMultipleExtensionCoder

      public static <Term extends AMonomial<Term>,​ mPoly extends AMultivariatePolynomial<Term,​ mPoly>,​ sPoly extends IUnivariatePolynomial<sPoly>> Coder<mPoly,​?,​?> mkMultipleExtensionCoder​(MultipleFieldExtension<Term,​mPoly,​sPoly> field, Map<String,​mPoly> variables)
      Create coder for multiple field extension
      Parameters:
      field - multiple field extension
      variables - map generator_string -> generator_as_ring_element
    • mkMultivariateCoder

      public static <Term extends AMonomial<Term>,​ Poly extends AMultivariatePolynomial<Term,​ Poly>> Coder<Poly,​Term,​Poly> mkMultivariateCoder​(MultivariateRing<Poly> ring, Map<String,​Poly> variables)
      Create coder for multivariate polynomial rings
      Parameters:
      ring - the ring
      variables - map string_variable -> ring_element
    • mkMultivariateCoder

      public static <Term extends AMonomial<Term>,​ Poly extends AMultivariatePolynomial<Term,​ Poly>> Coder<Poly,​Term,​Poly> mkMultivariateCoder​(MultivariateRing<Poly> ring, String... variables)
      Create coder for multivariate polynomial rings
      Parameters:
      ring - the ring
      variables - polynomial variables
    • mkMultivariateCoder

      public static <E> Coder<MultivariatePolynomial<E>,​Monomial<E>,​MultivariatePolynomial<E>> mkMultivariateCoder​(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,​?,​?> cfCoder, Map<String,​MultivariatePolynomial<E>> variables)
      Create coder for multivariate polynomial rings
      Parameters:
      ring - the ring
      cfCoder - coder for coefficient ring elements
      variables - map string_variable -> ring_element
    • mkMultivariateCoder

      public static <E> Coder<MultivariatePolynomial<E>,​Monomial<E>,​MultivariatePolynomial<E>> mkMultivariateCoder​(MultivariateRing<MultivariatePolynomial<E>> ring, Coder<E,​?,​?> cfCoder, String... variables)
      Create parser for multivariate polynomial rings
      Parameters:
      ring - the ring
      cfCoder - coder of coefficient ring elements
      variables - polynomial variables
    • mkUnivariateCoder

      public static <Poly extends IUnivariatePolynomial<Poly>> Coder<Poly,​?,​?> mkUnivariateCoder​(IPolynomialRing<Poly> ring, Map<String,​Poly> variables)
      Create coder for univariate polynomial rings
      Parameters:
      ring - the ring
      variables - map string_variable -> ring_element
    • mkUnivariateCoder

      public static <Poly extends IUnivariatePolynomial<Poly>> Coder<Poly,​?,​?> mkUnivariateCoder​(IPolynomialRing<Poly> ring, String variable)
      Create coder for univariate polynomial rings
      Parameters:
      ring - the ring
      variable - variable string
    • mkUnivariateCoder

      public static <E> Coder<UnivariatePolynomial<E>,​?,​?> mkUnivariateCoder​(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,​?,​?> cfCoder, Map<String,​UnivariatePolynomial<E>> variables)
      Create coder for univariate polynomial rings
      Parameters:
      ring - the ring
      cfCoder - coder of coefficient ring elements
      variables - map string_variable -> ring_element
    • mkUnivariateCoder

      public static <E> Coder<UnivariatePolynomial<E>,​?,​?> mkUnivariateCoder​(IPolynomialRing<UnivariatePolynomial<E>> ring, Coder<E,​?,​?> cfCoder, String variable)
      Create coder for univariate polynomial rings
      Parameters:
      ring - the ring
      cfCoder - coder of coefficient ring elements
      variable - string variable
    • mkRationalsCoder

      public static <E> Coder<Rational<E>,​?,​?> mkRationalsCoder​(Rationals<E> ring, Coder<E,​?,​?> elementsCoder)
      Create coder for rational elements
    • mkNestedCoder

      public static <E,​ I> Coder<E,​?,​?> mkNestedCoder​(Ring<E> ring, Map<String,​E> variables, Coder<I,​?,​?> innerCoder, SerializableFunction<I,​E> imageFunc)
      Create coder for nested rings (e.g. fractions over polynomials etc).

      Example:

      
       // GF(17, 3) as polynomials over "t"
       FiniteField gf = Rings.GF(17, 3);
       // parser of univariate polynomials over "t" from GF(17, 3)
       Coder gfParser = Coder.mkUnivariateCoder(gf, mkVars(gf, "t"));
      
       // ring GF(17, 3)[x, y, z]
       MultivariateRing> polyRing = Rings.MultivariateRing(3, gf);
       // parser of multivariate polynomials over GF(17, 3)
       Coder, ?, ?> polyParser = Coder.mkMultivariateCoder(polyRing,
       gfParser, "x", "y", "z");
      
       // field Frac(GF(17, 3)[x, y, z])
       Rationals> fracRing = Rings.Frac(polyRing);
       // parser of elements in Frac(GF(17, 3)[x, y, z])
       Coder>, ?, ?> fracParser =
                    Coder.mkNestedCoder(
                         fracRing,                        // the frac field
                         new HashMap<>(),                 // variables (no any)
                         polyParser,                      // parser of multivariate polynomials
                         p -> new Rational<>(polyRing, p) // convert from polys to fractions
                    );
       
      Parameters:
      ring - the ring
      variables - map string_variable -> ring_element
      innerCoder - coder for underlying ring elements
      imageFunc - mapping from @{code I} to @{code E}
    • parse

      public Element parse​(String string)
      Parse string
      Specified by:
      parse in interface IParser<Element>
    • parse

      public Element parse​(Tokenizer tokenizer)
      Parse stream of tokens into ring element