class MetallicRatios { private static List names = new ArrayList<>() static { names.add("Platinum") names.add("Golden") names.add("Silver") names.add("Bronze") names.add("Copper") names.add("Nickel") names.add("Aluminum") names.add("Iron") names.add("Tin") names.add("Lead") } private static void lucas(long b) { printf("Lucas sequence for %s ratio, where b = %d\n", names[b], b) print("First 15 elements: ") long x0 = 1 long x1 = 1 printf("%d, %d", x0, x1) for (int i = 1; i < 13; ++i) { long x2 = b * x1 + x0 printf(", %d", x2) x0 = x1 x1 = x2 } println() } private static void metallic(long b, int dp) { BigInteger x0 = BigInteger.ONE BigInteger x1 = BigInteger.ONE BigInteger x2 BigInteger bb = BigInteger.valueOf(b) BigDecimal ratio = BigDecimal.ONE.setScale(dp) int iters = 0 String prev = ratio.toString() while (true) { iters++ x2 = bb * x1 + x0 String thiz = (x2.toBigDecimal().setScale(dp) / x1.toBigDecimal().setScale(dp)).toString() if (prev == thiz) { String plural = "s" if (iters == 1) { plural = "" } printf("Value after %d iteration%s: %s\n\n", iters, plural, thiz) return } prev = thiz x0 = x1 x1 = x2 } } static void main(String[] args) { for (int b = 0; b < 10; ++b) { lucas(b) metallic(b, 32) } println("Golden ratio, where b = 1:") metallic(1, 256) } }