public static String sequence(int target) {
    if (target == 0) return "0";

    int valat1 = Fib.findLowestValAt1(target);
    String ret = "0 " + valat1 + " ";
    if (target == valat1) return ret.trim();

    int valat0 = 0;
    int current = valat0 + valat1;
    do {
      ret += current + " ";
      valat0 = valat1;
      valat1 = current;
      current = valat0 + valat1;
    } while (current <= target);

    return ret.trim();
  }
  public static String sequence(BigInteger target) {
    if (target.compareTo(new BigInteger("2147483647")) < 0) return sequence(target.intValue());

    // this actually does need to be handled as a big integer

    BigInteger valat1 = Fib.findLowestValAt1(target);
    String ret = "0 " + valat1 + " ";
    if (target.equals(valat1)) return ret.trim();

    BigInteger valat0 = BigInteger.ZERO;
    BigInteger current = valat0.add(valat1);
    do {
      ret += current + " ";
      valat0 = valat1;
      valat1 = current;
      current = valat0.add(valat1);
    } while (current.compareTo(target) <= 0);

    return ret.trim();
  }