package org.spaceroots.rkcheck;

import java.math.BigDecimal;
import junit.framework.*;

public class QuadraticSurdTest
  extends TestCase {

  public QuadraticSurdTest(String name) {
    super(name);
  }

  public void testNullDenominator() {
    try {
      QuadraticSurd f = new QuadraticSurd(1l, 0);
      fail("an exception should have been thrown");
    } catch (ArithmeticException e) {
    } catch (Exception e) {
      fail("wrong exception caught");
    }
  }

  public void testToString() {
    checkValue(new QuadraticSurd(1, 2),  "1 / 2");
    checkValue(new QuadraticSurd(-1, 2), "-1 / 2");
    checkValue(new QuadraticSurd(1, -2), "-1 / 2");
    checkValue(new QuadraticSurd(-1, -2), "1 / 2");
    checkValue(new QuadraticSurd(0, 500), "0");
    checkValue(new QuadraticSurd(-12), "-12");
    checkValue(new QuadraticSurd(12), "12");
  }

  public void testSimplification() {
    checkValue(new QuadraticSurd(2, 4), "1 / 2");
    checkValue(new QuadraticSurd(307692, 999999), "4 / 13");
    checkValue(new QuadraticSurd(999999, 307692), "13 / 4");
  }

  public void testInvert() {

    QuadraticSurd f = new QuadraticSurd(2, 4);
    f.invertSelf();
    checkValue(f, "2");
    f.invertSelf();
    checkValue(f, "1 / 2");

    f = new QuadraticSurd(120);
    f.invertSelf();
    checkValue(f, "1 / 120");

    f = new QuadraticSurd(0, 4);
    try {
      f.invertSelf();
      fail("an exception should have been thrown");
    } catch (ArithmeticException e) {
    } catch (Exception e) {
      fail("wrong exception caught");
    }

    f = new QuadraticSurd(307692, 999999);
    QuadraticSurd fInverse = QuadraticSurd.invert(f);
    checkValue(fInverse, "13 / 4");
    checkValue(f, "4 / 13");

    f = new QuadraticSurd(1, 2, 3, 4);
    checkValue(QuadraticSurd.invert(f), "(-4 + 8 sqrt(3)) / 11");

  }

  public void testAddition() {

    QuadraticSurd f1 = new QuadraticSurd(4, 6);
    f1.addToSelf(f1);
    checkValue(f1, "4 / 3");

    checkValue(QuadraticSurd.add(new QuadraticSurd(17, 3),
                                 new QuadraticSurd(-17, 3)),
               "0");
    checkValue(QuadraticSurd.add(new QuadraticSurd(2, 3),
                                 new QuadraticSurd(3, 4)),
               "17 / 12");
    checkValue(QuadraticSurd.add(new QuadraticSurd(1, 6),
                                 new QuadraticSurd(2, 6)),
               "1 / 2");
    checkValue(QuadraticSurd.add(new QuadraticSurd(4, 5),
                                 new QuadraticSurd(-3, 4)),
               "1 / 20");
    checkValue(QuadraticSurd.add(new QuadraticSurd(-3, 4),
                                 new QuadraticSurd(4, 5)),
               "1 / 20");

  }

  public void testSubtraction() {

    QuadraticSurd f1 = new QuadraticSurd(4, 6);
    f1.subtractFromSelf(f1);
    checkValue(f1, "0");

    checkValue(QuadraticSurd.subtract(new QuadraticSurd(7, 3),
                                      new QuadraticSurd(-7, 3)),
               "14 / 3");

    checkValue(QuadraticSurd.subtract(new QuadraticSurd(3, 4),
                                      new QuadraticSurd(2, 3)),
               "1 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(3, 4),
                                      new QuadraticSurd(-2, 3)),
               "17 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(-3, 4),
                                      new QuadraticSurd(2, 3)),
               "-17 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(-3, 4),
                                      new QuadraticSurd(-2, 3)),
               "-1 / 12");

    checkValue(QuadraticSurd.subtract(new QuadraticSurd(2, 3),
                                      new QuadraticSurd(3, 4)),
               "-1 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(-2, 3),
                                      new QuadraticSurd(3, 4)),
               "-17 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(2, 3),
                                      new QuadraticSurd(-3, 4)),
               "17 / 12");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(-2, 3),
                                      new QuadraticSurd(-3, 4)),
               "1 / 12");

    checkValue(QuadraticSurd.subtract(new QuadraticSurd(1, 6),
                                      new QuadraticSurd(2, 6)),
               "-1 / 6");
    checkValue(QuadraticSurd.subtract(new QuadraticSurd(1, 2),
                                      new QuadraticSurd(1, 6)),
               "1 / 3");

  }

  public void testMultiplication() {

    QuadraticSurd f = new QuadraticSurd(2, 3);
    f.multiplySelf(new QuadraticSurd(9,4));
    checkValue(f, "3 / 2");

    checkValue(QuadraticSurd.multiply(new QuadraticSurd(1, 2),
                                      new QuadraticSurd(0)),
               "0");
    checkValue(QuadraticSurd.multiply(new QuadraticSurd(4, 15),
                                      new QuadraticSurd(-5, 2)),
               "-2 / 3");
    checkValue(QuadraticSurd.multiply(new QuadraticSurd(-4, 15),
                                      new QuadraticSurd(5, 2)),
               "-2 / 3");
    checkValue(QuadraticSurd.multiply(new QuadraticSurd(4, 15),
                                      new QuadraticSurd(5, 2)),
               "2 / 3");
    checkValue(QuadraticSurd.multiply(new QuadraticSurd(-4, 15),
                                      new QuadraticSurd(-5, 2)),
               "2 / 3");


    QuadraticSurd qs1 = new QuadraticSurd(1, 2, 5, 3);
    QuadraticSurd qs2 = new QuadraticSurd(3, -1, 5, 2);
    checkValue(QuadraticSurd.multiply(qs1, qs2), "(-7 + 5 sqrt(5)) / 6");

    qs1 = new QuadraticSurd(2, -3, 11, 5);
    qs2 = new QuadraticSurd(2,  3, 11, 19);
    assertTrue(QuadraticSurd.negate(QuadraticSurd.multiply(qs1, qs2)).isOne());

  }

  public void testDivision() {

    QuadraticSurd f = new QuadraticSurd(2, 3);
    f.divideSelf(new QuadraticSurd(4,9));
    checkValue(f, "3 / 2");

    try {
      QuadraticSurd.divide(new QuadraticSurd(1, 2),
                           new QuadraticSurd(0));
      fail("an exception should have been thrown");
    } catch (ArithmeticException e) {
    } catch (Exception e) {
      fail("wrong exception caught");
    }

    checkValue(QuadraticSurd.divide(new QuadraticSurd(4, 15),
                                    new QuadraticSurd(-2, 5)),
               "-2 / 3");
    checkValue(QuadraticSurd.divide(new QuadraticSurd(-4, 15),
                                    new QuadraticSurd(2, 5)),
               "-2 / 3");
    checkValue(QuadraticSurd.divide(new QuadraticSurd(4, 15),
                                    new QuadraticSurd(2, 5)),
               "2 / 3");
    checkValue(QuadraticSurd.divide(new QuadraticSurd(-4, 15),
                                    new QuadraticSurd(-2, 5)),
               "2 / 3");
    checkValue(QuadraticSurd.divide(new QuadraticSurd(2, 5, 2, 3),
                                    new QuadraticSurd(1, 4, 2, 2)),
               "(76 + 6 sqrt(2)) / 93");

  }

  public void testDormandPrince() {
    QuadraticSurd r = new QuadraticSurd(0);
    r.addToSelf(new QuadraticSurd(104257l, 1920240l));
    r.addToSelf(new QuadraticSurd(3399327l, 763840l));
    r.addToSelf(new QuadraticSurd(66578432l, 35198415l));
    r.addToSelf(new QuadraticSurd(-1674902723l, 288716400l));
    r.addToSelf(new QuadraticSurd(54980371265625l, 176692375811392l));
    r.addToSelf(new QuadraticSurd(-734375l, 4826304l));
    r.addToSelf(new QuadraticSurd(171414593l, 851261400l));
    r.addToSelf(new QuadraticSurd(137909l, 3084480l));
    checkValue(r, "1");
  }

  public void testDifferentFields() {
    try {
      QuadraticSurd.add(new QuadraticSurd(1, 2, 3, 4),
                        new QuadraticSurd(4, 3, 2, 1));
      fail("an exception should have been thrown");
    } catch (ArithmeticException e) {
    } catch (Exception e) {
      fail("wrong exception caught");
    }
  }

  public void testApproximation() {
    BigDecimal minusPi = new BigDecimal(-3.14159265358979323846264338328);
    checkValue(new QuadraticSurd(minusPi, new BigDecimal(0.2)),    "-3");
    checkValue(new QuadraticSurd(minusPi, new BigDecimal(1.0e-2)), "-22 / 7");
    checkValue(new QuadraticSurd(minusPi, new BigDecimal(1.0e-4)), "-333 / 106");
    checkValue(new QuadraticSurd(minusPi, new BigDecimal(1.0e-6)), "-355 / 113");
    checkValue(new QuadraticSurd(minusPi, new BigDecimal(1.0e-9)), "-103993 / 33102");
  }

  private void checkValue(QuadraticSurd f, String reference) {
    assertTrue(f.toString().equals(reference));
  }

  public static Test suite() {
    return new TestSuite(QuadraticSurdTest.class);
  }

}

 

Ads help maintain this website.