// Compute sequences A307371, A307588 and A307600 // By Dmitry Kamenetsky, 1/05/2019 import java.math.*; public class a307371 { private static final int SCALE = 40; private static final int ROUNDING_MODE = BigDecimal.ROUND_HALF_DOWN; public static void main(String[] args) { //n=2: A307371 //n=3: A307588 //n=4: A307600 int n=Integer.parseInt(args[0]); //n-th root System.out.println("x x^(1/"+n+")"); for (long i=0; true; i++) { BigDecimal a=new BigDecimal(""+i); a=nthRoot(n,a); String s=a.toString(); String s2=s.replaceAll("\\.",""); if (s2.indexOf(""+i)==0) System.out.println(i+" "+s); } } //from https://stackoverflow.com/questions/22695654/computing-the-nth-root-of-p-using-bigdecimals public static BigDecimal nthRoot(final int n, final BigDecimal a) { return nthRoot(n, a, BigDecimal.valueOf(.1).movePointLeft(SCALE)); } private static BigDecimal nthRoot(final int n, final BigDecimal a, final BigDecimal p) { if (a.compareTo(BigDecimal.ZERO) < 0) { throw new IllegalArgumentException("nth root can only be calculated for positive numbers"); } if (a.equals(BigDecimal.ZERO)) { return BigDecimal.ZERO; } BigDecimal xPrev = a; BigDecimal x = a.divide(new BigDecimal(n), SCALE, ROUNDING_MODE); // starting "guessed" value... while (x.subtract(xPrev).abs().compareTo(p) > 0) { xPrev = x; x = BigDecimal.valueOf(n - 1.0) .multiply(x) .add(a.divide(x.pow(n - 1), SCALE, ROUNDING_MODE)) .divide(new BigDecimal(n), SCALE, ROUNDING_MODE); } return x; } }