LocalUnitTheorem.java :  » Math » algebra » ru » susu » algebra » centralunits » alternating » tex » local » Java Open Source

Java Open Source » Math » algebra 
algebra » ru » susu » algebra » centralunits » alternating » tex » local » LocalUnitTheorem.java
package ru.susu.algebra.centralunits.alternating.tex.local;

import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.ObjectUtils;

import ru.susu.algebra.centralunits.alternating.initializers.ExponentsInitializer;
import ru.susu.algebra.centralunits.alternating.initializers.LocalUnitsInitializer;
import ru.susu.algebra.centralunits.alternating.initializers.QuadraticFieldsInitializer;
import ru.susu.algebra.centralunits.alternating.initializers.SpecialRowsInitializer;
import ru.susu.algebra.centralunits.alternating.tex.CharacterFieldLemmasGenerator;
import ru.susu.algebra.centralunits.alternating.tex.SpecialCharactersUnionMathMethod;
import ru.susu.algebra.chartable.constructor.AlternatingCharTableUtil;
import ru.susu.algebra.field.quadratic.QuadraticFieldGeneralForm;
import ru.susu.algebra.jtex.ITexElement;
import ru.susu.algebra.jtex.ITexSubItemsElement;
import ru.susu.algebra.jtex.SimpleTexElementWithCode;
import ru.susu.algebra.jtex.StringTexElement;
import ru.susu.algebra.jtex.TexBeginEndElement;
import ru.susu.algebra.jtex.UnionTexElement;
import ru.susu.algebra.jtex.formula.FormatSymbols;
import ru.susu.algebra.jtex.formula.FormulaTexElement;
import ru.susu.algebra.jtex.formula.GreekSymbols;
import ru.susu.algebra.jtex.formula.MathSymbols;
import ru.susu.algebra.jtex.utils.TexUtils;
import ru.susu.algebra.pair.Pair;
import ru.susu.algebra.partition.Partition;
import ru.susu.algebra.properties.IPropertySource;
import ru.susu.algebra.util.CollectionUtils;
import ru.susu.algebra.util.NumberUtilities;
import ru.susu.algebra.util.StringUtilities;

/**
 * @author akargapolov
 * @since: 13.09.2010
 */
public class LocalUnitTheorem extends SpecialCharactersUnionMathMethod
{
  private static final Class[] DEPENDENCIES = {SpecialRowsInitializer.class,  QuadraticFieldsInitializer.class, ExponentsInitializer.class, LocalUnitsInitializer.class};

  public static String getLabelName(Integer rowNumber)
  {
    return "LocalUnitTheorem_" + rowNumber;
  }

  /**
   *    c {@link MathSymbols#CDOT} suffix,    0,  zeroCaze
   * @param prefix 
   * @param c 
   * @param suffix 
   * @param zeroCaze      0
   */
  private String getCoefficientPresentation(String prefix, BigInteger c, Object suffix, Object zeroCaze)
  {
    return c.equals(BigInteger.ZERO) ? zeroCaze.toString() : prefix + c + MathSymbols.CDOT + " " +suffix;
  }

/*  \begin{theo}\label{sto}
  ,  $u_{20}(\lambda)\in\Un(Z(\Z A_{14}))$. 
  \[
  \lambda=(1+\omega_{13})^{43680n}
  \]
     $n$.
  \end{theo} */
  private ITexElement getTheorem(Partition partition, IPropertySource ps) throws Exception
  {
    Integer rowNumber = SpecialRowsInitializer.getRowNumber(ps, partition);
    QuadraticFieldGeneralForm generateUnit = QuadraticFieldsInitializer.getGeneralUnit(ps, partition);
    BigInteger pow = LocalUnitsInitializer.getPow(ps, partition);

    ITexSubItemsElement theorem = TexBeginEndElement.threorem().addSubElement(SimpleTexElementWithCode.label(getLabelName(rowNumber)));
    theorem.addSubElement(StringTexElement.text(
        ",  $u" + TexUtils.index(rowNumber) + TexUtils.inBrackets(GreekSymbols.LAMBDA) + MathSymbols.IN + "\\Un" +
        TexUtils.inBrackets("Z" + TexUtils.inBrackets("\\Z A" + TexUtils.index(partition.getPresentedNumber()))) + "$. \n" +
        "\\[\n" +
        GreekSymbols.LAMBDA + " = " + TexUtils.inBrackets(TexUtils.toTexString(generateUnit)) + TexUtils.pow(pow + "n" + TexUtils.index(rowNumber)) +
        "\\]\n" +
        "   $n" + TexUtils.index(rowNumber) + "$."));
    return theorem;
  }

  private ITexElement getProof(Partition partition, IPropertySource ps) throws Exception
  {
    Integer rowNumber = SpecialRowsInitializer.getRowNumber(ps, partition);
    QuadraticFieldGeneralForm generalUnit = QuadraticFieldsInitializer.getGeneralUnit(ps, partition);
    String generalUnitString = TexUtils.toTexString(generalUnit);
    BigInteger pmod = AlternatingCharTableUtil.calcZX(partition);


    TexBeginEndElement proof = TexBeginEndElement.proof();
    String alphaPlusBetaOmega = GreekSymbols.ALPHA + MathSymbols.PLUS + GreekSymbols.BETA + GreekSymbols.OMEGA;

  /*    \ref{u13}
    \[
    \lambda=\varepsilon(1+\omega_{13})^k=\alpha+\beta\omega,
    \]
     $\varepsilon\in\{1,-1\}$, $k,\alpha,\beta\in\Z$. */
    proof.addSubElement(StringTexElement.text(
        "  " + SimpleTexElementWithCode.ref(CharacterFieldLemmasGenerator.getLemmaName(rowNumber)).generateContent() + "\n" +
        "\\[\n" +
        GreekSymbols.LAMBDA + "=" + FormulaTexElement.VAREPSILON + "\\left(" + TexUtils.toTexString(generalUnit) + "\\right)^k = " +
        alphaPlusBetaOmega + ",\n" +
        "\\]\n" +
        " $" + FormulaTexElement.VAREPSILON + FormulaTexElement.IN + "\\{1,-1\\}$  $k\\in\\Z$.\n\n"));


  /*  ,    ,  $k\geqslant0$.
    , 
    \[
    \lambda^*=\alpha+\beta\omega^*=\varepsilon(1+\omega_{13}^*)^k=\varepsilon(1+\omega_{13})^{-k}.
    \]
    
    \[
    u(\lambda)u(\lambda^*)=1.
    \]
        $\chi_{20}$  $\chi_{21}$
    ,   $u(\lambda)$  $u(\lambda^*)$ 
    $\Un(Z(\Z A_{14}))$.   ,  
    ,  $k\geqslant0$.*/
    proof.addSubElement(StringTexElement.text(
        ",    ,  $k" + MathSymbols.GEQSLANT + "0$.\n" +
        ", \n" +
        "\\[\n" +
        GreekSymbols.LAMBDA + "^*=" + alphaPlusBetaOmega + "^*=" + FormulaTexElement.VAREPSILON + TexUtils.inBrackets(generalUnitString + "^*") + "^k=" +
        FormulaTexElement.VAREPSILON + TexUtils.inBrackets(generalUnitString) + TexUtils.pow("-k") + ".\n" +
        "\\]\n" +
        "\n" +
        "\\[\n" +
        "u" + TexUtils.inBrackets(GreekSymbols.LAMBDA) + "u" + TexUtils.inBrackets(GreekSymbols.LAMBDA + "^*") + "=1.\n" +
        "\\]\n" +
        "    $" + GreekSymbols.CHI + TexUtils.index(rowNumber) + "$  $" + GreekSymbols.CHI + TexUtils.index(rowNumber+1) + "$\n" +
        ",   $u(" + GreekSymbols.LAMBDA + ")$  $u(" + GreekSymbols.LAMBDA + "^*)$ \n" +
        "$\\Un(Z(\\Z A" + TexUtils.index(partition.getPresentedNumber()) + "))$.   ,   \n" +
        ",  $k" + MathSymbols.GEQSLANT + "0$.\n\n"));

    BigInteger alpha = LocalUnitsInitializer.getAlphaCoefficient(ps, partition);
    BigInteger beta = LocalUnitsInitializer.getBetaCoefficient(ps, partition);
  /*  , $k\geqslant0$.      $m$
    \[
    (1+\omega_{13})^m=\alpha_n+\beta_m\omega.
    \]
      \ref{dz20} 
    \begin{equation}\label{veps20}
    \alpha_k\equiv\varepsilon\pmod{917280}\text{  }
    \beta_k\equiv0\pmod{917280}.
    \end{equation} */
    proof.addSubElement(StringTexElement.text(
        ", $k" + MathSymbols.GEQSLANT + "0$.      $m$\n" +
        "\\[\n" +
        TexUtils.inBrackets(generalUnitString) + "^k=" + GreekSymbols.ALPHA + TexUtils.index("k") + MathSymbols.PLUS + GreekSymbols.BETA + TexUtils.index("k") + GreekSymbols.OMEGA + ".\n" +
        "\\]\n" +
        "  " + SimpleTexElementWithCode.ref(DivisibilityLemma.getLabelName(partition, ps)).generateContent() + " \n")).addSubElement(
        TexBeginEndElement.equation().addSubElement(SimpleTexElementWithCode.label("veps" + rowNumber)).addSubElement(StringTexElement.text(
            GreekSymbols.ALPHA + TexUtils.index("k") + MathSymbols.EQUIV + "1" + getCoefficientPresentation("+", alpha.mod(pmod), "t", StringUtilities.EMPTY_STRING) +
              FormulaTexElement.pmod(pmod) + FormulaTexElement.text("  ") + "\n" +
            GreekSymbols.BETA + TexUtils.index("k") + MathSymbols.EQUIV + getCoefficientPresentation("", beta.mod(pmod), "t", "0") + FormulaTexElement.pmod(pmod) + ".")));

  /*       ,   
    
    \begin{equation}
    \label{sr}
    \left\{\begin{aligned}
     \left\{\begin{aligned}
    \alpha_k\equiv\varepsilon\pmod{64}\\
    \beta_k\equiv0\pmod{64}
     \end{aligned}\right.\\
    \alpha_k\equiv\varepsilon\pmod{13}\\
    \beta_k\equiv0\pmod{13}
     \end{aligned}\right.
    \end{aligned}
    \right.
    \end{equation} */
    StringBuffer buffer = new StringBuffer();
    List<BigInteger> mods = LocalUnitsInitializer.getMods(ps, partition);
    for (BigInteger mod : mods)
    {
      buffer = (buffer.length() == 0) ? buffer : buffer.append(MathSymbols.DOUBLE_INV_SLASH + "\n");
      buffer.append(UnionTexElement.union().addSubElement(StringTexElement.text(MathSymbols.LEFT + "\\{"))
        .addSubElement(TexBeginEndElement.aligned().addSubElement(StringTexElement.text(
        GreekSymbols.ALPHA + TexUtils.index("k") + MathSymbols.EQUIV +  "1" + getCoefficientPresentation("+", alpha.mod(mod), "t", StringUtilities.EMPTY_STRING)+
          FormulaTexElement.pmod(mod) + MathSymbols.DOUBLE_INV_SLASH + "\n" +
        GreekSymbols.BETA + TexUtils.index("k") + MathSymbols.EQUIV + getCoefficientPresentation("", beta.mod(mod), "t", "0") + FormulaTexElement.pmod(mod))))
        .addSubElement(StringTexElement.text(MathSymbols.RIGHT + ".")).generateContent());
    }
    proof.addSubElement(StringTexElement.text(
        "     ,    \n")).addSubElement(TexBeginEndElement.equation()
        .addSubElement(SimpleTexElementWithCode.label("sr" + rowNumber))
        .addSubElement(StringTexElement.text(MathSymbols.LEFT + "\\{"))
        .addSubElement(TexBeginEndElement.aligned().addSubElement(StringTexElement.text(buffer.toString())))
        .addSubElement(StringTexElement.text(MathSymbols.RIGHT + "."))).addSubElement(StringTexElement.newLineDouble());

    BigInteger trace = generalUnit.getTrace();
    BigInteger norm = generalUnit.norm();
    String traceFF = NumberUtilities.toString(trace, false, false);
    String normTF = NumberUtilities.toString(norm.multiply(BigInteger.valueOf(-1)), true, false);
  /*    \ref{st}    
    \begin{align*}
    \alpha_{n+2}&=3\alpha_{n+1}+\alpha_n,\ \alpha_0=1,\ \alpha_1=2,\\
    \beta_{n+2}&=3\beta_{n+1}+ \beta_n,\ \beta_0=0,\ \beta_1=1,
    \end{align*}
     $\tr(1+\omega_{13})=3$  $\Norm(1+\omega_{13})=1$   
    \ref{om}.   $\{\alpha_m\}_{m=0}^\infty$ 
    $\{\beta_m\}_{m=0}^\infty$   $64$,$9$, $25$, $49$  $13$. */
    proof.addSubElement(StringTexElement.text("   "))
        .addSubElement(TexBeginEndElement.align().setWithoutNumber()  //align*
            .addSubElement(StringTexElement.text(
            GreekSymbols.ALPHA + TexUtils.index("k+2") + "&=" + traceFF + GreekSymbols.ALPHA + TexUtils.index("k+1") + normTF +
            GreekSymbols.ALPHA + TexUtils.index("k") + ",\\ " + GreekSymbols.ALPHA + TexUtils.index("0") + "=1,\\ " +
            GreekSymbols.ALPHA + TexUtils.index("1") + "=" + generalUnit.getA() + "," + MathSymbols.DOUBLE_INV_SLASH + "\n" +

            GreekSymbols.BETA + TexUtils.index("k+2") + "&=" + traceFF + GreekSymbols.BETA + TexUtils.index("k+1") + normTF +
            GreekSymbols.BETA + TexUtils.index("k") + ",\\ " + GreekSymbols.BETA + TexUtils.index("0") + "=0,\\ " +
            GreekSymbols.BETA + TexUtils.index("1") + "=" + generalUnit.getB() + ",")))
        .addSubElement(StringTexElement.text(
            " $" + MathSymbols.TR + TexUtils.inBrackets(generalUnitString) + " = " + trace + "$  $" +
            MathSymbols.NORM + TexUtils.inBrackets(generalUnitString) + " = " + norm + "$.\n" +
            "  $\\{" + GreekSymbols.ALPHA + TexUtils.index("k") + "\\}_{n=0}^" + MathSymbols.INFTY + "$  \n" +
            "$\\{" + GreekSymbols.BETA + TexUtils.index("k") + "\\}_{n=0}^" + MathSymbols.INFTY + "$   $" +
            CollectionUtils.toString(mods, ",") + "$.")).addSubElement(StringTexElement.newLineDouble());

  /*  \item
      $13$ 
    \begin{align*}
    \{\alpha_m\}_{m=0}^\infty= \{1, 1, 4, 0, 4, 12, 1, 2, 7, 10, 11, 4,\\
    10, 8, 8, 6, 0, 6, 5, 8, 3, 4, 2, 10, 6, 2, 12, 12, 9, 0, 9, 1, 12,\\
    11, 6, 3, 2, 9, 3, 5, 5, 7, 0, 7, 8, 5,10, 9, 11, 3, 7, 11, 1, 1,\dots \} \\
    \{\beta_m\}_{m=0}^\infty= \{0, 1, 3, 10, 7, 5, 9, 6, 1, 9, 2, 2, 8,\\
    0, 8, 11, 2, 4, 1, 7, 9, 8, 7, 3, 3, 12, 0, 12, 10, 3, 6, 8, 4, 7,\\
    12, 4, 11, 11, 5, 0, 5, 2, 11, 9, 12, 6, 4, 5, 6, 10, 10, 1, 0,
    1\dots\}
    \end{align*}
    ,       $52$,
    ,   $\varepsilon=1$,   \ref{sr} 
    
    \begin{equation}
    \left\{\begin{aligned} \alpha_{52l}&\equiv1\pmod{13},\\
    \beta_{52l}&\equiv 0\pmod{13}
    \end{aligned}\right.
    \end{equation}
       $r\geqslant0$.*/
    TexBeginEndElement enumerate = TexBeginEndElement.enumerate();
    for (BigInteger mod : mods)
    {
      List<Pair<BigInteger, BigInteger>> period = LocalUnitsInitializer.getPeriod(ps, partition, mod);
      BigInteger intPeriod = LocalUnitsInitializer.getIntegerPeriod(ps, partition, mod);
      enumerate.addSubElement(StringTexElement.text(
          FormatSymbols.ITEM + "\n" +
          "  $" + mod + "$ "));

      if (period.size() <= 500)
      {
        enumerate.addSubElement(TexBeginEndElement.align().setWithoutNumber()  //align*
          .addSubElement(StringTexElement.text("\\{" + GreekSymbols.ALPHA + TexUtils.index("k") + "\\}" + TexUtils.index("k=0") + TexUtils.pow(MathSymbols.INFTY) +
            "= \\{" + getFormattedPeriod(CollectionUtils.getKeys(period)) + "," + FormatSymbols.DOTS + "\\}" + MathSymbols.DOUBLE_INV_SLASH + "\n" +
            "\\{" + GreekSymbols.BETA + TexUtils.index("k") + "\\}" + TexUtils.index("k=0") + TexUtils.pow(MathSymbols.INFTY) +
            "= \\{" + getFormattedPeriod(CollectionUtils.getValues(period)) + "," + FormatSymbols.DOTS + "\\}")));
      }
      enumerate.addSubElement(StringTexElement.text(
          ",       $" + intPeriod + "$,\n" +
          "  " + SimpleTexElementWithCode.ref("sr" + rowNumber).generateContent() + " \n" +
          ""));
      for (Map.Entry<BigInteger, BigInteger> entry : LocalUnitsInitializer.listGoodPeriods(ps, partition, mod))
      {
        BigInteger alphaC = LocalUnitsInitializer.getAlphaCoefficient(ps, partition).mod(mod);
        BigInteger betaC = LocalUnitsInitializer.getBetaCoefficient(ps, partition).mod(mod);
        BigInteger index = entry.getKey();
        BigInteger t = entry.getValue();
        String sindex = TexUtils.index((ObjectUtils.equals(index, BigInteger.ZERO) ? "" : index + " + ") + intPeriod + "k");
        enumerate.addSubElement(TexBeginEndElement.equation().setWithoutNumber().addSubElement(StringTexElement.text(
          MathSymbols.LEFT + "\\{")).addSubElement(TexBeginEndElement.aligned().addSubElement(StringTexElement.text(
              GreekSymbols.ALPHA + sindex + "&" + getCoefficientPresentation(MathSymbols.EQUIV + "1+", alphaC, t, StringUtilities.EMPTY_STRING) + MathSymbols.EQUIV +
                LocalUnitsInitializer.calcAlpha(ps, partition, t, mod) + FormulaTexElement.pmod(mod) + "," + MathSymbols.DOUBLE_INV_SLASH + "\n" +
              GreekSymbols.BETA + sindex + "&" + getCoefficientPresentation(MathSymbols.EQUIV, betaC, t, StringUtilities.EMPTY_STRING) + MathSymbols.EQUIV +
                LocalUnitsInitializer.calcBeta(ps, partition, t, mod) + FormulaTexElement.pmod(mod))))
          .addSubElement(StringTexElement.text(MathSymbols.RIGHT + ".")));
      }
      enumerate.addSubElement(StringTexElement.text("   $k" + MathSymbols.GEQSLANT + "0$.\n"));
    }
    proof.addSubElement(enumerate);

  /*   ,   
    \[
    k=96p=6r=60s=112t=52l.
    \]
        $96$, $6$, $60$, $112$  $52$ 
    \[
    32\cdot3\cdot5\cdot7\cdot13=43680.
    \]
      \ref{exp}  .*/
    buffer = new StringBuffer(" ,   \n\\[\nk");
    int index = 0;
    List<BigInteger> intPeriods = LocalUnitsInitializer.getReducedPeriods(ps, partition);
    for (BigInteger period : intPeriods)
    {
      buffer.append("=" + period + "p" + TexUtils.index(++index));
    }
    BigInteger lcm = LocalUnitsInitializer.getPow(ps, partition);
    buffer.append(".\n\\]\n").append("    $" + CollectionUtils.toString(intPeriods, ", ") + "$ \n")
         .append("\\[\n" + TexUtils.getFactorization(lcm) + " = " + lcm + ".\n\\]\n")
         .append("  " + SimpleTexElementWithCode.ref("exp").generateContent() + "  .");
    proof.addSubElement(StringTexElement.text(buffer.toString()));

    return proof;
  }

  @Override
  protected ITexElement getElement(Partition partition, IPropertySource ps) throws Exception
  {
    return UnionTexElement.union().addSubElement(getTheorem(partition, ps)).addSubElement(getProof(partition, ps)).addSubElement(StringTexElement.newLineDouble());
  }

  @Override
  protected Class[] getDependentInitializers()
  {
    return DEPENDENCIES;
  }

  private static String getFormattedPeriod(Collection<BigInteger> collection)
  {
    StringBuffer buffer = new StringBuffer();
    for (Collection<BigInteger>  splitted : CollectionUtils.split(collection, 20))
    {
      buffer = (buffer.length() ==0) ? buffer : buffer.append(", " + MathSymbols.DOUBLE_INV_SLASH + "\n");
      buffer.append(CollectionUtils.toString(splitted, ", "));
    }
    return buffer.toString();
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.