Last active
May 23, 2016 16:29
-
-
Save griotspeak/c0b4c453dbd817e7b26327e243591c55 to your computer and use it in GitHub Desktop.
Divmod Int.swift
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
extension Int { | |
internal func divMod(other:Int) -> (quotient:Int, modulus:Int) { | |
let quotient = self / other | |
let remainder = self % other | |
if (quotient > 0) || (remainder == 0) { | |
return (quotient, remainder) | |
} else if quotient == 0 && (self > 0) && (other < 0) { | |
let div = quotient - 1 | |
let result = (div * other) - self | |
return (div, -result) | |
} else { | |
let signSituation = ((self > 0) || (other < 0)) | |
let div = ((quotient == 0) && signSituation) ? quotient : quotient - 1 | |
let result = abs((div * other) - self) | |
return (div, (other < 0) ? -result : result) | |
} | |
} | |
internal func quotRem(other:Int) -> (quotient:Int, remainder:Int) { | |
return (self / other, self % other) | |
} | |
} |
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
// | |
// IntTests.swift | |
// Rational | |
// | |
// Created by TJ Usiyan on 3/25/16. | |
// Copyright © 2016 Buttons and Lights LLC. All rights reserved. | |
// | |
import XCTest | |
import SwiftCheck | |
@testable import Symbolic | |
@warn_unused_result public func ==(lhs:(quotient: Int, modulus: Int), rhs:(quotient: Int, modulus: Int)) -> Bool { | |
return (lhs.quotient == rhs.quotient) && (lhs.modulus == rhs.modulus) | |
} | |
@warn_unused_result public func ==(lhs:(quotient: Int, remainder: Int), rhs:(quotient: Int, remainder: Int)) -> Bool { | |
return (lhs.quotient == rhs.quotient) && (lhs.remainder == rhs.remainder) | |
} | |
class IntTests: XCTestCase { | |
func testAll() { | |
property("(x ‘quot‘ y)⋆y + (x ‘rem‘ y) == x ") <- forAll { (x: Int, y: Int) in | |
return (y != 0) ==> { | |
let (quot, rem) = x.quotRem(y) | |
if (quot * y) + rem == x { | |
return true | |
} else { | |
return false | |
} | |
} | |
} | |
property("(x ‘div‘ y)⋆y + (x ‘mod‘ y) == x ") <- forAll { (x: Int, y: Int) in | |
return (y != 0) ==> { | |
let (div, mod) = x.divMod(y) | |
if (div * y) + mod == x { | |
return true | |
} else { | |
return false | |
} | |
} | |
} | |
} | |
func testDivMod() { | |
XCTAssertTrue((-25).divMod( 12) == (quotient: -3, modulus: 11)) | |
XCTAssertTrue((-24).divMod( 12) == (quotient: -2, modulus: 0)) | |
XCTAssertTrue((-23).divMod( 12) == (quotient: -2, modulus: 1)) | |
XCTAssertTrue((-22).divMod( 12) == (quotient: -2, modulus: 2)) | |
XCTAssertTrue((-21).divMod( 12) == (quotient: -2, modulus: 3)) | |
XCTAssertTrue((-20).divMod( 12) == (quotient: -2, modulus: 4)) | |
XCTAssertTrue((-19).divMod( 12) == (quotient: -2, modulus: 5)) | |
XCTAssertTrue((-18).divMod( 12) == (quotient: -2, modulus: 6)) | |
XCTAssertTrue((-17).divMod( 12) == (quotient: -2, modulus: 7)) | |
XCTAssertTrue((-16).divMod( 12) == (quotient: -2, modulus: 8)) | |
XCTAssertTrue((-15).divMod( 12) == (quotient: -2, modulus: 9)) | |
XCTAssertTrue((-14).divMod( 12) == (quotient: -2, modulus: 10)) | |
XCTAssertTrue((-13).divMod( 12) == (quotient: -2, modulus: 11)) | |
XCTAssertTrue((-12).divMod( 12) == (quotient: -1, modulus: 0)) | |
XCTAssertTrue((-11).divMod( 12) == (quotient: -1, modulus: 1)) | |
XCTAssertTrue((-10).divMod( 12) == (quotient: -1, modulus: 2)) | |
XCTAssertTrue(( -9).divMod( 12) == (quotient: -1, modulus: 3)) | |
XCTAssertTrue(( -8).divMod( 12) == (quotient: -1, modulus: 4)) | |
XCTAssertTrue(( -7).divMod( 12) == (quotient: -1, modulus: 5)) | |
XCTAssertTrue(( -6).divMod( 12) == (quotient: -1, modulus: 6)) | |
XCTAssertTrue(( -5).divMod( 12) == (quotient: -1, modulus: 7)) | |
XCTAssertTrue(( -4).divMod( 12) == (quotient: -1, modulus: 8)) | |
XCTAssertTrue(( -3).divMod( 12) == (quotient: -1, modulus: 9)) | |
XCTAssertTrue(( -2).divMod( 12) == (quotient: -1, modulus: 10)) | |
XCTAssertTrue(( -1).divMod( 12) == (quotient: -1, modulus: 11)) | |
XCTAssertTrue(( 0).divMod( 12) == (quotient: 0, modulus: 0)) | |
XCTAssertTrue(( 1).divMod( 12) == (quotient: 0, modulus: 1)) | |
XCTAssertTrue(( 2).divMod( 12) == (quotient: 0, modulus: 2)) | |
XCTAssertTrue(( 3).divMod( 12) == (quotient: 0, modulus: 3)) | |
XCTAssertTrue(( 4).divMod( 12) == (quotient: 0, modulus: 4)) | |
XCTAssertTrue(( 5).divMod( 12) == (quotient: 0, modulus: 5)) | |
XCTAssertTrue(( 6).divMod( 12) == (quotient: 0, modulus: 6)) | |
XCTAssertTrue(( 7).divMod( 12) == (quotient: 0, modulus: 7)) | |
XCTAssertTrue(( 8).divMod( 12) == (quotient: 0, modulus: 8)) | |
XCTAssertTrue(( 9).divMod( 12) == (quotient: 0, modulus: 9)) | |
XCTAssertTrue(( 10).divMod( 12) == (quotient: 0, modulus: 10)) | |
XCTAssertTrue(( 11).divMod( 12) == (quotient: 0, modulus: 11)) | |
XCTAssertTrue(( 12).divMod( 12) == (quotient: 1, modulus: 0)) | |
XCTAssertTrue(( 13).divMod( 12) == (quotient: 1, modulus: 1)) | |
XCTAssertTrue(( 14).divMod( 12) == (quotient: 1, modulus: 2)) | |
XCTAssertTrue(( 15).divMod( 12) == (quotient: 1, modulus: 3)) | |
XCTAssertTrue(( 16).divMod( 12) == (quotient: 1, modulus: 4)) | |
XCTAssertTrue(( 17).divMod( 12) == (quotient: 1, modulus: 5)) | |
XCTAssertTrue(( 18).divMod( 12) == (quotient: 1, modulus: 6)) | |
XCTAssertTrue(( 19).divMod( 12) == (quotient: 1, modulus: 7)) | |
XCTAssertTrue(( 20).divMod( 12) == (quotient: 1, modulus: 8)) | |
XCTAssertTrue(( 21).divMod( 12) == (quotient: 1, modulus: 9)) | |
XCTAssertTrue(( 22).divMod( 12) == (quotient: 1, modulus: 10)) | |
XCTAssertTrue(( 23).divMod( 12) == (quotient: 1, modulus: 11)) | |
XCTAssertTrue(( 24).divMod( 12) == (quotient: 2, modulus: 0)) | |
XCTAssertTrue(( 25).divMod( 12) == (quotient: 2, modulus: 1)) | |
XCTAssertTrue((-25).divMod(-12) == (quotient: 2, modulus: -1)) | |
XCTAssertTrue((-24).divMod(-12) == (quotient: 2, modulus: 0)) | |
XCTAssertTrue((-23).divMod(-12) == (quotient: 1, modulus: -11)) | |
XCTAssertTrue((-22).divMod(-12) == (quotient: 1, modulus: -10)) | |
XCTAssertTrue((-21).divMod(-12) == (quotient: 1, modulus: -9)) | |
XCTAssertTrue((-20).divMod(-12) == (quotient: 1, modulus: -8)) | |
XCTAssertTrue((-19).divMod(-12) == (quotient: 1, modulus: -7)) | |
XCTAssertTrue((-18).divMod(-12) == (quotient: 1, modulus: -6)) | |
XCTAssertTrue((-17).divMod(-12) == (quotient: 1, modulus: -5)) | |
XCTAssertTrue((-16).divMod(-12) == (quotient: 1, modulus: -4)) | |
XCTAssertTrue((-15).divMod(-12) == (quotient: 1, modulus: -3)) | |
XCTAssertTrue((-14).divMod(-12) == (quotient: 1, modulus: -2)) | |
XCTAssertTrue((-13).divMod(-12) == (quotient: 1, modulus: -1)) | |
XCTAssertTrue((-12).divMod(-12) == (quotient: 1, modulus: 0)) | |
XCTAssertTrue((-11).divMod(-12) == (quotient: 0, modulus: -11)) | |
XCTAssertTrue((-10).divMod(-12) == (quotient: 0, modulus: -10)) | |
XCTAssertTrue(( -9).divMod(-12) == (quotient: 0, modulus: -9)) | |
XCTAssertTrue(( -8).divMod(-12) == (quotient: 0, modulus: -8)) | |
XCTAssertTrue(( -7).divMod(-12) == (quotient: 0, modulus: -7)) | |
XCTAssertTrue(( -6).divMod(-12) == (quotient: 0, modulus: -6)) | |
XCTAssertTrue(( -5).divMod(-12) == (quotient: 0, modulus: -5)) | |
XCTAssertTrue(( -4).divMod(-12) == (quotient: 0, modulus: -4)) | |
XCTAssertTrue(( -3).divMod(-12) == (quotient: 0, modulus: -3)) | |
XCTAssertTrue(( -2).divMod(-12) == (quotient: 0, modulus: -2)) | |
XCTAssertTrue(( -1).divMod(-12) == (quotient: 0, modulus: -1)) | |
XCTAssertTrue(( 0).divMod(-12) == (quotient: 0, modulus: 0)) | |
XCTAssertTrue(( 1).divMod(-12) == (quotient: -1, modulus: -11)) | |
XCTAssertTrue(( 2).divMod(-12) == (quotient: -1, modulus: -10)) | |
XCTAssertTrue(( 3).divMod(-12) == (quotient: -1, modulus: -9)) | |
XCTAssertTrue(( 4).divMod(-12) == (quotient: -1, modulus: -8)) | |
XCTAssertTrue(( 5).divMod(-12) == (quotient: -1, modulus: -7)) | |
XCTAssertTrue(( 6).divMod(-12) == (quotient: -1, modulus: -6)) | |
XCTAssertTrue(( 7).divMod(-12) == (quotient: -1, modulus: -5)) | |
XCTAssertTrue(( 8).divMod(-12) == (quotient: -1, modulus: -4)) | |
XCTAssertTrue(( 9).divMod(-12) == (quotient: -1, modulus: -3)) | |
XCTAssertTrue(( 10).divMod(-12) == (quotient: -1, modulus: -2)) | |
XCTAssertTrue(( 11).divMod(-12) == (quotient: -1, modulus: -1)) | |
XCTAssertTrue(( 12).divMod(-12) == (quotient: -1, modulus: 0)) | |
XCTAssertTrue(( 13).divMod(-12) == (quotient: -2, modulus: -11)) | |
XCTAssertTrue(( 14).divMod(-12) == (quotient: -2, modulus: -10)) | |
XCTAssertTrue(( 15).divMod(-12) == (quotient: -2, modulus: -9)) | |
XCTAssertTrue(( 16).divMod(-12) == (quotient: -2, modulus: -8)) | |
XCTAssertTrue(( 17).divMod(-12) == (quotient: -2, modulus: -7)) | |
XCTAssertTrue(( 18).divMod(-12) == (quotient: -2, modulus: -6)) | |
XCTAssertTrue(( 19).divMod(-12) == (quotient: -2, modulus: -5)) | |
XCTAssertTrue(( 20).divMod(-12) == (quotient: -2, modulus: -4)) | |
XCTAssertTrue(( 21).divMod(-12) == (quotient: -2, modulus: -3)) | |
XCTAssertTrue(( 22).divMod(-12) == (quotient: -2, modulus: -2)) | |
XCTAssertTrue(( 23).divMod(-12) == (quotient: -2, modulus: -1)) | |
XCTAssertTrue(( 24).divMod(-12) == (quotient: -2, modulus: 0)) | |
XCTAssertTrue(( 25).divMod(-12) == (quotient: -3, modulus: -11)) | |
} | |
func testQuotRem() { | |
XCTAssertTrue((-25).quotRem( 12) == (quotient: -2, remainder: -1)) | |
XCTAssertTrue((-24).quotRem( 12) == (quotient: -2, remainder: 0)) | |
XCTAssertTrue((-23).quotRem( 12) == (quotient: -1, remainder: -11)) | |
XCTAssertTrue((-22).quotRem( 12) == (quotient: -1, remainder: -10)) | |
XCTAssertTrue((-21).quotRem( 12) == (quotient: -1, remainder: -9)) | |
XCTAssertTrue((-20).quotRem( 12) == (quotient: -1, remainder: -8)) | |
XCTAssertTrue((-19).quotRem( 12) == (quotient: -1, remainder: -7)) | |
XCTAssertTrue((-18).quotRem( 12) == (quotient: -1, remainder: -6)) | |
XCTAssertTrue((-17).quotRem( 12) == (quotient: -1, remainder: -5)) | |
XCTAssertTrue((-16).quotRem( 12) == (quotient: -1, remainder: -4)) | |
XCTAssertTrue((-15).quotRem( 12) == (quotient: -1, remainder: -3)) | |
XCTAssertTrue((-14).quotRem( 12) == (quotient: -1, remainder: -2)) | |
XCTAssertTrue((-13).quotRem( 12) == (quotient: -1, remainder: -1)) | |
XCTAssertTrue((-12).quotRem( 12) == (quotient: -1, remainder: 0)) | |
XCTAssertTrue((-11).quotRem( 12) == (quotient: 0, remainder: -11)) | |
XCTAssertTrue((-10).quotRem( 12) == (quotient: 0, remainder: -10)) | |
XCTAssertTrue(( -9).quotRem( 12) == (quotient: 0, remainder: -9)) | |
XCTAssertTrue(( -8).quotRem( 12) == (quotient: 0, remainder: -8)) | |
XCTAssertTrue(( -7).quotRem( 12) == (quotient: 0, remainder: -7)) | |
XCTAssertTrue(( -6).quotRem( 12) == (quotient: 0, remainder: -6)) | |
XCTAssertTrue(( -5).quotRem( 12) == (quotient: 0, remainder: -5)) | |
XCTAssertTrue(( -4).quotRem( 12) == (quotient: 0, remainder: -4)) | |
XCTAssertTrue(( -3).quotRem( 12) == (quotient: 0, remainder: -3)) | |
XCTAssertTrue(( -2).quotRem( 12) == (quotient: 0, remainder: -2)) | |
XCTAssertTrue(( -1).quotRem( 12) == (quotient: 0, remainder: -1)) | |
XCTAssertTrue(( 0).quotRem( 12) == (quotient: 0, remainder: 0)) | |
XCTAssertTrue(( 1).quotRem( 12) == (quotient: 0, remainder: 1)) | |
XCTAssertTrue(( 2).quotRem( 12) == (quotient: 0, remainder: 2)) | |
XCTAssertTrue(( 3).quotRem( 12) == (quotient: 0, remainder: 3)) | |
XCTAssertTrue(( 4).quotRem( 12) == (quotient: 0, remainder: 4)) | |
XCTAssertTrue(( 5).quotRem( 12) == (quotient: 0, remainder: 5)) | |
XCTAssertTrue(( 6).quotRem( 12) == (quotient: 0, remainder: 6)) | |
XCTAssertTrue(( 7).quotRem( 12) == (quotient: 0, remainder: 7)) | |
XCTAssertTrue(( 8).quotRem( 12) == (quotient: 0, remainder: 8)) | |
XCTAssertTrue(( 9).quotRem( 12) == (quotient: 0, remainder: 9)) | |
XCTAssertTrue(( 10).quotRem( 12) == (quotient: 0, remainder: 10)) | |
XCTAssertTrue(( 11).quotRem( 12) == (quotient: 0, remainder: 11)) | |
XCTAssertTrue(( 12).quotRem( 12) == (quotient: 1, remainder: 0)) | |
XCTAssertTrue(( 13).quotRem( 12) == (quotient: 1, remainder: 1)) | |
XCTAssertTrue(( 14).quotRem( 12) == (quotient: 1, remainder: 2)) | |
XCTAssertTrue(( 15).quotRem( 12) == (quotient: 1, remainder: 3)) | |
XCTAssertTrue(( 16).quotRem( 12) == (quotient: 1, remainder: 4)) | |
XCTAssertTrue(( 17).quotRem( 12) == (quotient: 1, remainder: 5)) | |
XCTAssertTrue(( 18).quotRem( 12) == (quotient: 1, remainder: 6)) | |
XCTAssertTrue(( 19).quotRem( 12) == (quotient: 1, remainder: 7)) | |
XCTAssertTrue(( 20).quotRem( 12) == (quotient: 1, remainder: 8)) | |
XCTAssertTrue(( 21).quotRem( 12) == (quotient: 1, remainder: 9)) | |
XCTAssertTrue(( 22).quotRem( 12) == (quotient: 1, remainder: 10)) | |
XCTAssertTrue(( 23).quotRem( 12) == (quotient: 1, remainder: 11)) | |
XCTAssertTrue(( 24).quotRem( 12) == (quotient: 2, remainder: 0)) | |
XCTAssertTrue(( 25).quotRem( 12) == (quotient: 2, remainder: 1)) | |
XCTAssertTrue((-25).quotRem(-12) == (quotient: 2, remainder: -1)) | |
XCTAssertTrue((-24).quotRem(-12) == (quotient: 2, remainder: 0)) | |
XCTAssertTrue((-23).quotRem(-12) == (quotient: 1, remainder: -11)) | |
XCTAssertTrue((-22).quotRem(-12) == (quotient: 1, remainder: -10)) | |
XCTAssertTrue((-21).quotRem(-12) == (quotient: 1, remainder: -9)) | |
XCTAssertTrue((-20).quotRem(-12) == (quotient: 1, remainder: -8)) | |
XCTAssertTrue((-19).quotRem(-12) == (quotient: 1, remainder: -7)) | |
XCTAssertTrue((-18).quotRem(-12) == (quotient: 1, remainder: -6)) | |
XCTAssertTrue((-17).quotRem(-12) == (quotient: 1, remainder: -5)) | |
XCTAssertTrue((-16).quotRem(-12) == (quotient: 1, remainder: -4)) | |
XCTAssertTrue((-15).quotRem(-12) == (quotient: 1, remainder: -3)) | |
XCTAssertTrue((-14).quotRem(-12) == (quotient: 1, remainder: -2)) | |
XCTAssertTrue((-13).quotRem(-12) == (quotient: 1, remainder: -1)) | |
XCTAssertTrue((-12).quotRem(-12) == (quotient: 1, remainder: 0)) | |
XCTAssertTrue((-11).quotRem(-12) == (quotient: 0, remainder: -11)) | |
XCTAssertTrue((-10).quotRem(-12) == (quotient: 0, remainder: -10)) | |
XCTAssertTrue(( -9).quotRem(-12) == (quotient: 0, remainder: -9)) | |
XCTAssertTrue(( -8).quotRem(-12) == (quotient: 0, remainder: -8)) | |
XCTAssertTrue(( -7).quotRem(-12) == (quotient: 0, remainder: -7)) | |
XCTAssertTrue(( -6).quotRem(-12) == (quotient: 0, remainder: -6)) | |
XCTAssertTrue(( -5).quotRem(-12) == (quotient: 0, remainder: -5)) | |
XCTAssertTrue(( -4).quotRem(-12) == (quotient: 0, remainder: -4)) | |
XCTAssertTrue(( -3).quotRem(-12) == (quotient: 0, remainder: -3)) | |
XCTAssertTrue(( -2).quotRem(-12) == (quotient: 0, remainder: -2)) | |
XCTAssertTrue(( -1).quotRem(-12) == (quotient: 0, remainder: -1)) | |
XCTAssertTrue(( 0).quotRem(-12) == (quotient: 0, remainder: 0)) | |
XCTAssertTrue(( 1).quotRem(-12) == (quotient: 0, remainder: 1)) | |
XCTAssertTrue(( 2).quotRem(-12) == (quotient: 0, remainder: 2)) | |
XCTAssertTrue(( 3).quotRem(-12) == (quotient: 0, remainder: 3)) | |
XCTAssertTrue(( 4).quotRem(-12) == (quotient: 0, remainder: 4)) | |
XCTAssertTrue(( 5).quotRem(-12) == (quotient: 0, remainder: 5)) | |
XCTAssertTrue(( 6).quotRem(-12) == (quotient: 0, remainder: 6)) | |
XCTAssertTrue(( 7).quotRem(-12) == (quotient: 0, remainder: 7)) | |
XCTAssertTrue(( 8).quotRem(-12) == (quotient: 0, remainder: 8)) | |
XCTAssertTrue(( 9).quotRem(-12) == (quotient: 0, remainder: 9)) | |
XCTAssertTrue(( 10).quotRem(-12) == (quotient: 0, remainder: 10)) | |
XCTAssertTrue(( 11).quotRem(-12) == (quotient: 0, remainder: 11)) | |
XCTAssertTrue(( 12).quotRem(-12) == (quotient: -1, remainder: 0)) | |
XCTAssertTrue(( 13).quotRem(-12) == (quotient: -1, remainder: 1)) | |
XCTAssertTrue(( 14).quotRem(-12) == (quotient: -1, remainder: 2)) | |
XCTAssertTrue(( 15).quotRem(-12) == (quotient: -1, remainder: 3)) | |
XCTAssertTrue(( 16).quotRem(-12) == (quotient: -1, remainder: 4)) | |
XCTAssertTrue(( 17).quotRem(-12) == (quotient: -1, remainder: 5)) | |
XCTAssertTrue(( 18).quotRem(-12) == (quotient: -1, remainder: 6)) | |
XCTAssertTrue(( 19).quotRem(-12) == (quotient: -1, remainder: 7)) | |
XCTAssertTrue(( 20).quotRem(-12) == (quotient: -1, remainder: 8)) | |
XCTAssertTrue(( 21).quotRem(-12) == (quotient: -1, remainder: 9)) | |
XCTAssertTrue(( 22).quotRem(-12) == (quotient: -1, remainder: 10)) | |
XCTAssertTrue(( 23).quotRem(-12) == (quotient: -1, remainder: 11)) | |
XCTAssertTrue(( 24).quotRem(-12) == (quotient: -2, remainder: 0)) | |
XCTAssertTrue(( 25).quotRem(-12) == (quotient: -2, remainder: 1)) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment