Feature: Polynomials and rational functions #469
@ -247,10 +247,6 @@ public open class PolynomialSpace<C, A>(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Raises [arg] to the integer power [exponent].
|
|
||||||
*/ // TODO: To optimize boxing
|
|
||||||
override fun power(arg: Polynomial<C>, exponent: UInt): Polynomial<C> = exponentiateBySquaring(arg, exponent)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instance of zero polynomial (zero of the polynomial ring).
|
* Instance of zero polynomial (zero of the polynomial ring).
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018-2021 KMath contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package space.kscience.kmath.functions
|
|
||||||
|
|
||||||
import space.kscience.kmath.operations.*
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: All of this should be moved to algebraic structures' place for utilities
|
|
||||||
// FIXME: Move receiver to context receiver
|
|
||||||
/**
|
|
||||||
* Raises [arg] to the integer power [exponent].
|
|
||||||
*
|
|
||||||
* This is implementation of variation of [exponentiation by squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring)
|
|
||||||
*
|
|
||||||
* @param arg the base of the power.
|
|
||||||
* @param exponent the exponent of the power.
|
|
||||||
* @return [arg] raised to the power [exponent].
|
|
||||||
* @author Gleb Minaev
|
|
||||||
*/
|
|
||||||
internal tailrec fun <C> Ring<C>.exponentiateBySquaring(arg: C, exponent: UInt): C =
|
|
||||||
when {
|
|
||||||
exponent == 0u -> zero
|
|
||||||
exponent == 1u -> arg
|
|
||||||
exponent and 1u == 0u -> exponentiateBySquaring(arg * arg, exponent shr 1)
|
|
||||||
exponent and 1u == 1u -> multiplyExponentiatedBySquaring(arg, arg * arg, exponent shr 1)
|
|
||||||
else -> error("Error in multiplication group instant by unsigned integer: got reminder by division by 2 different from 0 and 1")
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: Move receiver to context receiver
|
|
||||||
/**
|
|
||||||
* Multiplies [base] and [arg] raised to the integer power [exponent].
|
|
||||||
*
|
|
||||||
* This is implementation of variation of [exponentiation by squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring)
|
|
||||||
*
|
|
||||||
* @param base the multiplicand.
|
|
||||||
* @param arg the base of the power.
|
|
||||||
* @param exponent the exponent of the power.
|
|
||||||
* @return product of [base] and [arg] raised to the power [exponent].
|
|
||||||
* @author Gleb Minaev
|
|
||||||
*/
|
|
||||||
internal tailrec fun <C> RingOps<C>.multiplyExponentiatedBySquaring(base: C, arg: C, exponent: UInt): C =
|
|
||||||
when {
|
|
||||||
exponent == 0u -> base
|
|
||||||
exponent == 1u -> base * arg
|
|
||||||
exponent and 1u == 0u -> multiplyExponentiatedBySquaring(base, arg * arg, exponent shr 1)
|
|
||||||
exponent and 1u == 1u -> multiplyExponentiatedBySquaring(base * arg, arg * arg, exponent shr 1)
|
|
||||||
else -> error("Error in multiplication group instant by unsigned integer: got reminder by division by 2 different from 0 and 1")
|
|
||||||
}
|
|
@ -1,129 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018-2021 KMath contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package space.kscience.kmath.functions
|
|
||||||
|
|
||||||
|
|
||||||
import space.kscience.kmath.operations.invoke
|
|
||||||
import space.kscience.kmath.operations.Field
|
|
||||||
import kotlin.jvm.JvmInline
|
|
||||||
import kotlin.test.Test
|
|
||||||
import kotlin.test.assertEquals
|
|
||||||
|
|
||||||
@JvmInline
|
|
||||||
value class Expr(val expr: String)
|
|
||||||
|
|
||||||
object ExprRing : Field<Expr> {
|
|
||||||
override fun Expr.unaryMinus(): Expr = Expr("-${expr}")
|
|
||||||
override fun add(left: Expr, right: Expr): Expr = Expr("(${left.expr} + ${right.expr})")
|
|
||||||
override fun multiply(left: Expr, right: Expr): Expr = Expr("(${left.expr} * ${right.expr})")
|
|
||||||
override val zero: Expr = Expr("0")
|
|
||||||
override val one: Expr = Expr("1")
|
|
||||||
override fun divide(left: Expr, right: Expr): Expr = Expr("(${left.expr} / ${right.expr})")
|
|
||||||
override fun scale(a: Expr, value: Double): Expr = Expr("(${a.expr} / $value)")
|
|
||||||
}
|
|
||||||
|
|
||||||
class AlgebraicStubTest {
|
|
||||||
@Test
|
|
||||||
fun test_multiplyExponentiationBySquaring_for_UInt() {
|
|
||||||
ExprRing {
|
|
||||||
assertEquals(
|
|
||||||
"57",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 0u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 0u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * 179)",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 1u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 1u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * (179 * 179))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 2u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 2u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * 179) * (179 * 179))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 3u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 3u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * ((179 * 179) * (179 * 179)))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 4u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 4u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * 179) * ((179 * 179) * (179 * 179)))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 5u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 5u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * (179 * 179)) * ((179 * 179) * (179 * 179)))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 6u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 6u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(((57 * 179) * (179 * 179)) * ((179 * 179) * (179 * 179)))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 7u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 7u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * (((179 * 179) * (179 * 179)) * ((179 * 179) * (179 * 179))))",
|
|
||||||
multiplyExponentiatedBySquaring(Expr("57"), Expr("179"), 8u).expr,
|
|
||||||
"tried multiplyExponentiationBySquaring(57, 179, 8u)"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
fun test_exponentiationBySquaring_for_UInt() {
|
|
||||||
ExprRing {
|
|
||||||
assertEquals(
|
|
||||||
"0",
|
|
||||||
exponentiateBySquaring(Expr("57"), 0u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 0u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"57",
|
|
||||||
exponentiateBySquaring(Expr("57"), 1u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 1u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * 57)",
|
|
||||||
exponentiateBySquaring(Expr("57"), 2u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 2u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * (57 * 57))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 3u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 3u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * 57) * (57 * 57))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 4u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 4u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(57 * ((57 * 57) * (57 * 57)))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 5u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 5u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * 57) * ((57 * 57) * (57 * 57)))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 6u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 6u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"((57 * (57 * 57)) * ((57 * 57) * (57 * 57)))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 7u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 7u)"
|
|
||||||
)
|
|
||||||
assertEquals(
|
|
||||||
"(((57 * 57) * (57 * 57)) * ((57 * 57) * (57 * 57)))",
|
|
||||||
exponentiateBySquaring(Expr("57"), 8u).expr,
|
|
||||||
"tried exponentiationBySquaring(57, 8u)"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user