P-Adic square roots: Difference between revisions

m
Improved code.
m (Corrected an error in a comment.)
m (Improved code.)
Line 685:
List<List<Integer>> tests = List.of( List.of( 2, 497, 10496 ),
List.of( 3, 15403, 26685 ),
List.of( 57, -19, 1 ) );
for ( List<Integer> test : tests ) {
Line 697:
System.out.println("The rational value is " + square.convertToRational());
System.out.println();
}
}
Line 704:
final class PadicSquareRoot {
/**
* Create a p-adicPadicSquareRoot number, with p = 'aPrime',
* which is the p-adic square root of the given rational 'aNumerator' / 'aDenominator'.
*/
Line 714:
prime = aPrime;
digits = new ArrayList<Integer>(DIGITS_SIZE);
order = 0;
// Process rational zero
Line 731:
aDenominator /= prime;
order -= 1;
}
if ( ( order & 1 ) != 0 ) {
throw new AssertionError("Number does not have a square root in " + prime + "-adic");
aNumerator + " / " + aDenominator + " does not have a square root in " + prime + "-adic");
}
order >>= 1;
numerator = BigInteger.valueOf(aNumerator);
denominator = BigInteger.valueOf(aDenominator);
if ( prime == 2 ) {
Line 749 ⟶ 745:
}
/**
* Return the additive inverse of this p-adicPadicSquareRoot number.
*/
public PadicSquareRoot negate() {
Line 764 ⟶ 760:
/**
* Return the product of this p-adicPadicSquareRoot number and the given p-adicPadicSquareRoot number.
*/
public PadicSquareRoot multiply(PadicSquareRoot aOther) {
Line 779 ⟶ 775:
/**
* Return a string representation of this p-adicPadicSquareRoot as a rational number.
*/
public String convertToRational() {
Line 797 ⟶ 793:
}
 
final MathContext mathContext = new MathContext(PRECISION, RoundingMode.HALF_UP);
final BigDecimal primeBig = BigDecimal.valueOf(prime);
final BigDecimal maximumPrimeBig = BigDecimal.valueOf(maximumPrime);
Line 847 ⟶ 843:
/**
* Return a string representation of this p-adicPadicSquareRoot number.
*/
public String toString() {
List<Integer> numbers = new ArrayList<Integer>(digits);
Collections.reverse(numbers);
padWithZeros(numbers);
Collections.reverse(numbers);
String numberString = numbers.stream().map(String::valueOf).collect(Collectors.joining());
StringBuilder builder = new StringBuilder(numberString);
if ( order >= 0 ) {
for ( int i = 0; i < order; i++ ) {
builder.append("0");
builder.deleteCharAt(0);
}
Line 865 ⟶ 860:
} else {
builder.insert(builder.length() + order, ".");
while ( builder.toString().endsWith("0") ) {
builder.deleteCharAt(0builder.length() - 1);
}
}
Line 873 ⟶ 872:
/**
* Create a p-adicPadicSquareRoot, with p = 'aPrime', directly from a list of digits.
*
* With 'aOrder' = 0, the list [1, 2, 3, 4, 5] creates the p-adic ...54321.0
Line 890 ⟶ 889:
private void squareRootEvenPrime(int aNumerator, int aDenominator) {
if ( Math.floorMod(aNumerator * aDenominator, 8) != 1 ) {
throw new AssertionError(aNumerator + " / " + aDenominator + "Number does not have a square root in 2-adic");
}
 
Line 898 ⟶ 897:
// Further digits
final BigInteger numerator = BigInteger.valueOf(aNumerator);
final BigInteger denominator = BigInteger.valueOf(aDenominator);
while ( digits.size() < DIGITS_SIZE ) {
BigInteger factor = denominator.multiply(sum.multiply(sum)).subtract(numerator);
Line 929 ⟶ 931:
if ( firstDigit == 0 ) {
throw new IllegalArgumentException("Number does not have a square root in " + prime + "-adic");
aNumerator + " / " + aDenominator + " does not have a square root in " + prime + "-adic");
}
Line 936 ⟶ 937:
// Further digits
final BigInteger numerator = BigInteger.valueOf(aNumerator);
final BigInteger denominator = BigInteger.valueOf(aDenominator);
final BigInteger firstDigitBig = BigInteger.valueOf(firstDigit);
final BigInteger primeBig = BigInteger.valueOf(prime);
Line 942 ⟶ 945:
 
BigInteger sum = firstDigitBig;
for ( int i = 2; i <= DIGITS_SIZE; i++ ) {
BigInteger nextSum =
sum.subtract(coefficient.multiply(denominator.multiply(sum).multiply(sum).subtract(numerator)));
Line 996 ⟶ 999:
private List<Integer> digits;
private int order;
private BigInteger numerator;
private BigInteger denominator;
private final int prime;
Line 1,009 ⟶ 1,010:
{{ out }}
<pre>
Numberumber: 497 / 10496 in 2-adic
The two square roots are:
...0101011010110011.1101
Line 1,023 ⟶ 1,024:
The rational value is 15403 / 26685
 
Number: -19 / 1 in 57-adic
The two square roots are:
...44412011220244402310126260226045320643.0
...00032433224200042146540406440621346024.0
The p-adic value is ...44444444444444444116666666666666666642.0
The rational value is -19 / 1
</pre>
886

edits