Last active
November 9, 2019 16:16
-
-
Save yytyd/728b4adb5d32db07d05772a144539be2 to your computer and use it in GitHub Desktop.
DualNumbers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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