Skip to content

Instantly share code, notes, and snippets.

@yytyd
Last active November 9, 2019 16:16
Show Gist options
  • Save yytyd/728b4adb5d32db07d05772a144539be2 to your computer and use it in GitHub Desktop.
Save yytyd/728b4adb5d32db07d05772a144539be2 to your computer and use it in GitHub Desktop.
DualNumbers
package model
case class DualNumbers(a: Double = 0d, b: Double = 0d) {
def + : DualNumbers = this
def - : DualNumbers = DualNumbers(-a, -b)
def <(rhs: DualNumbers): DualNumbers = this < rhs
def ++ : DualNumbers = DualNumbers(a + 1, b)
def -- : DualNumbers = DualNumbers(a - 1, b)
def +=(rhs: DualNumbers): DualNumbers =
DualNumbers(a + rhs.a, b + rhs.b)
def +=(rhs: Double): DualNumbers = this.copy(a = this.a + rhs)
def -=(rhs: DualNumbers): DualNumbers =
DualNumbers(a - rhs.a, b - rhs.b)
def -=(rhs: Double): DualNumbers = this.copy(a = this.a - rhs)
def *=(rhs: DualNumbers): DualNumbers = {
val _b = {
var ret = this.b * rhs.a
ret = ret + (this.a * rhs.b)
ret = ret * rhs.a
ret
}
val _a = this.a * rhs.a
DualNumbers(_a, _b)
}
def *=(rhs: Double): DualNumbers =
DualNumbers(a * rhs, b * rhs)
def /=(rhs: DualNumbers): DualNumbers = {
val _b = {
var ret = this.b * rhs.a
ret = ret - (this.a * rhs.b)
ret = ret / (rhs.a * rhs.a)
ret
}
val _a = this.a / rhs.a
DualNumbers(_a, _b)
}
def /=(rhs: Double): DualNumbers =
DualNumbers(a / rhs, b / rhs)
/**
* 現在の値をその逆数にする
* @return [[DualNumbers]]
*/
def inverse(): DualNumbers = {
assert(a != 0d)
val _a = 1d / a
val _b = b / -(a * a)
DualNumbers(_a, _b)
}
/**
* 現在の値をその共役にする
* @return [[DualNumbers]]
*/
def conjugate(): DualNumbers = this.copy(b = -b)
}
object DualNumbers {
/**
* 双対数の零元
* @return [[DualNumbers]]
*/
def zero(): DualNumbers = DualNumbers()
/**
* 双対数の加法単位元
* @return [[DualNumbers]]
*/
def additiveIdentity(): DualNumbers = zero()
/**
* 双対数の乗法単位元
* @return [[DualNumbers]]
*/
def multiplicativeIdentity(): DualNumbers = zero()
implicit def orderingDefinition: Ordering[DualNumbers] =
Ordering.by(e => (e.a, e.b))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment