Raw File
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
//
// vU1024Divide() is only available on OS X.
// REQUIRES: OS=macosx

import Accelerate

extension vU1024: IntegerLiteralConvertible, CustomStringConvertible, Equatable {
  public init(integerLiteral: Int) {
    var integerLiteral = integerLiteral
    self.init()
    memcpy(&self, &integerLiteral, sizeof(Int.self))
  }

  init(_ int: Int) {
    self.init(integerLiteral: int)
  }

  public var description: String {
    if self == 0 {
      return "0"
    }
    var digits: [Character] = []
    var intermediate = self
    var digit: vU1024 = 0
    repeat {
      (intermediate, digit) = quorem(intermediate, 10)
      digits.append(Character(UnicodeScalar(Int(digit) + 48)))
    } while intermediate != 0
    return String(digits.reverse())
  }
}

extension Int {
  init(_ u1024: vU1024) {
    var u1024 = u1024
    // NB: Doesn't overflow check
    self.init()
    memcpy(&self, &u1024, sizeof(Int.self))
  }
}

func *(x: vU1024, y: vU1024) -> vU1024 {
  var x = x
  var y = y
  var result = vU1024()
  vU1024HalfMultiply(&x, &y, &result)
  return result
}

func quorem(x: vU1024, _ y: vU1024) -> (vU1024, vU1024) {
  var x = x
  var y = y
  var quo = vU1024()
  var rem = vU1024()
  vU1024Divide(&x, &y, &quo, &rem)
  return (quo, rem)
}

public func ==(x: vU1024, y: vU1024) -> Bool {
  var x = x
  var y = y
  return memcmp(&x, &y, sizeof(vU1024.self)) == 0
}

func factorial(x: Int) -> vU1024 {
  var result: vU1024 = 1

  for i in 1...x {
    result = result * vU1024(i)
  }

  return result
}

// CHECK: 7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000
print(factorial(170))

back to top