All Downloads are FREE. Search and download functionalities are using the official Maven repository.

spire.algebra.Field.scala Maven / Gradle / Ivy

The newest version!
package spire.algebra

import spire.math._
import spire.macrosk.Ops

import scala.{specialized => spec}

trait Field[@spec(Int,Long,Float,Double) A] extends EuclideanRing[A] with MultiplicativeAbGroup[A] {
  def isWhole(a:A): Boolean
}

final class FieldOps[A](lhs:A)(implicit ev:Field[A]) {
  def /(rhs:Int) = ev.div(lhs, ev.fromInt(rhs))

  def isWhole() = macro Ops.unop[Boolean]
}

object Field {
  implicit object FloatIsField extends FloatIsField
  implicit object DoubleIsField extends DoubleIsField
  implicit object BigDecimalIsField extends BigDecimalIsField
  implicit object RationalIsField extends RationalIsField
  implicit object RealIsField extends RealIsField
  implicit def complexIsField[@spec(Float, Double) A: Fractional: Trig] =
    new ComplexIsField[A] {
      val f = Fractional[A]
      val t = Trig[A]
    }

  @inline final def apply[A](implicit f:Field[A]):Field[A] = f
}

trait FloatIsField extends Field[Float] with FloatIsEuclideanRing {
  def div(a:Float, b:Float) = a / b
  def isWhole(a:Float) = a % 1.0 == 0.0
}

trait DoubleIsField extends Field[Double] with DoubleIsEuclideanRing {
  def div(a:Double, b:Double) = a / b
  def isWhole(a:Double) = a % 1.0 == 0.0
}

trait BigDecimalIsField extends Field[BigDecimal] with BigDecimalIsEuclideanRing {
  def div(a:BigDecimal, b:BigDecimal) = a / b
  def isWhole(a:BigDecimal) = a % 1.0 == 0.0
}

trait RationalIsField extends Field[Rational] with RationalIsEuclideanRing {
  def div(a:Rational, b:Rational) = a / b
  def isWhole(a:Rational) = a.denominator == 1
}

trait RealIsField extends Field[Real] with RealIsEuclideanRing {
  def div(a:Real, b:Real) = a / b
  def isWhole(a:Real) = a % 1 == 0
}

trait ComplexIsField[@spec(Float,Double) A]
extends ComplexIsEuclideanRing[A] with Field[Complex[A]] {
  def div(a:Complex[A], b:Complex[A]) = a / b
  def isWhole(a:Complex[A]) = a.isWhole
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy