code: public class BigRationalFindPerfectNumbers {
      public static void main(String[] args) {
          int MAX_NUM = 1 << 19;
          System.out.println("Searching for perfect numbers in the range [1, " + (MAX_NUM - 1) + "]");
  
          BigRational TWO = BigRational.valueOf(2);
          for (int i = 1; i < MAX_NUM; i++) {
              BigRational reciprocalSum = BigRational.ONE;
              if (i > 1)
                  reciprocalSum = reciprocalSum.add(BigRational.valueOf(i).reciprocal());
              int maxDivisor = (int) Math.sqrt(i);
              if (maxDivisor >= i)
                  maxDivisor--;
  
              for (int divisor = 2; divisor <= maxDivisor; divisor++) {
                  if (i % divisor == 0) {
                      reciprocalSum = reciprocalSum.add(BigRational.valueOf(divisor).reciprocal());
                      int dividend = i / divisor;
                      if (divisor != dividend)
                          reciprocalSum = reciprocalSum.add(BigRational.valueOf(dividend).reciprocal());
                  }
              }
              if (reciprocalSum.equals(TWO))
                  System.out.println(String.valueOf(i) + " is a perfect number");
          }
      }
  }
  