74912


pythonで書かれたコードを参考にし、下記のようなコードを書いたのですが n >= 33 から  
「Thread 1: Swift runtime failure: arithmetic overflow」  
というエラーが出て動かなくなってしまいます。  
Swiftでこのような大きな数字の扱い方を教えていただけないでしょうか。  
よろしくお願いします。

[code]

    let n = 33
    var x = 3
    
    func powByMyself(n: Int, x: Int) -> Int {
        var x = x
        var n = n
        var ans = 1
        var count = 0
        while n > 0 {
            count += 1
            if n & 1 == 1 {
                ans *= x
                print(ans)
            }
            x *= x
            n >>= 1
        }
        return ans
    }
    
    powByMyself(n: n, x: x)
    
[/code]


CC BY-SA 4.0
2021-03-26T10:15:59.017
74909
2021-03-26T11:22:29.090
37960
question
swift
Swiftで繰り返し２乗法の勉強している際に「Swift runtime failure: arithmetic overflow」というエラーで詰まってしまいました


> Swiftでこのような大きな数字の扱い方を教えていただけないでしょうか。

Swiftの標準ライブラリには、Pythonのように「メモリの許す限りで任意の精度の整数を扱う」機能は含まれていません。なんらかの別ライブラリを探して利用するようにする必要があります。

例えば、`swift biginteger`で検索して出てきたSwift Package
Manager用の[NumberKitというパッケージ](https://github.com/objecthub/swift-
numberkit)を使うと、以下のように書けます。

[code]

    import Foundation
    import NumberKit
    
    let n: BigInt = 33
    var x: BigInt = 3
    
    func powByMyself(n: BigInt, x: BigInt) -> BigInt {
        var x = x
        var n = n
        var ans: BigInt = 1
        var count = 0
        while n > 0 {
            count += 1
            if n & 1 == 1 {
                ans *= x
                print(ans)
            }
            x *= x
            n >>= 1
        }
        return ans
    }
    
    powByMyself(n: n, x: x) //->3 5559060566555523
    
[/code]

型が`Int`となってしまうところの一部分を`NumberKit.BigInt`に置き換えるだけで、通常の演算子等がそのまま使えるようになっています。探せばSwift用の巨大整数演算ライブラリは他にも見つかると思いますが、ほぼ同様に使えるようになっているだろうと思います。


CC BY-SA 4.0
2021-03-26T11:22:29.090
74912
2021-03-26T11:22:29.090
13972
74909
answer