38 lines
1.0 KiB
Scala
38 lines
1.0 KiB
Scala
import java.math.BigInteger
|
|
|
|
object ArithmeticDerivative extends App {
|
|
|
|
println("Arithmetic derivatives for -99 to 100 inclusive:")
|
|
for {
|
|
n <- -99 to 100
|
|
column = n + 100
|
|
} print(f"${derivative(BigInteger.valueOf(n))}%4d${if (column % 10 == 0) "\n" else " "}")
|
|
|
|
println()
|
|
|
|
val seven = BigInteger.valueOf(7)
|
|
for (power <- 1 to 20) {
|
|
println(f"D(10^$power%d) / 7 = ${derivative(BigInteger.TEN.pow(power)).divide(seven)}")
|
|
}
|
|
|
|
def derivative(aNumber: BigInteger): BigInteger = {
|
|
if (aNumber.signum == -1) {
|
|
return derivative(aNumber.negate()).negate()
|
|
}
|
|
if (aNumber == BigInteger.ZERO || aNumber == BigInteger.ONE) {
|
|
return BigInteger.ZERO
|
|
}
|
|
|
|
var divisor = BigInteger.TWO
|
|
while (divisor.multiply(divisor).compareTo(aNumber) <= 0) {
|
|
if (aNumber.mod(divisor).signum == 0) {
|
|
val quotient = aNumber.divide(divisor)
|
|
return quotient.multiply(derivative(divisor)).add(divisor.multiply(derivative(quotient)))
|
|
}
|
|
divisor = divisor.add(BigInteger.ONE)
|
|
}
|
|
BigInteger.ONE
|
|
}
|
|
|
|
}
|