package com.github.davidmoten.rx; import rx.Observable; import rx.functions.Func0; import rx.functions.Func1; import rx.functions.Func2; public final class Maths { private Maths() { // prevent instantiation } public static Observable<Double> solveWithNewtonsMethod(final Func1<Double, Double> f, final Func1<Double, Double> dfdx, double x0) { return Observable.just(1).repeat().scan(x0, new Func2<Double, Integer, Double>() { @Override public Double call(Double xn, Integer n) { return xn - f.call(xn) / dfdx.call(xn); } }); } public static Observable<Double> solveWithNewtonsMethod(final Func1<Double, Double> f, final double x0, final double h) { Func1<Double, Double> dfdx = new Func1<Double, Double>() { @Override public Double call(Double x) { return (f.call(x + h) - f.call(x - h)) / 2.0 / h; } }; return solveWithNewtonsMethod(f, dfdx, x0); } public static Observable<Long> primes() { return Observable.defer(new Func0<Observable<Long>>() { final Mutable<Long> n = new Mutable<Long>(0L); @Override public Observable<Long> call() { return Observable.just(1).repeat().map(new Func1<Integer, Long>() { @Override public Long call(Integer t) { n.value += 1; return n.value; } }); } }).filter(new Func1<Long, Boolean>() { @Override public Boolean call(Long n) { if (n < 2) { return false; } for (int i = 2; i <= Math.floor(Math.sqrt(n)); i++) { if (n % i == 0) { return false; } } return true; } }); } private static final class Mutable<T> { T value; Mutable(T value) { this.value = value; } } }