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 hidden or 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 hidden or 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