階乗進法 factorial representation

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

階乗進法 factorial representation
実行:Playground

let N = 3

func factorial() {
    var c = [Int](repeating: 0, count: N + 2)
    var i = 0
    var k:Int
    repeat {
        print("\(i)", separator: "", terminator: "")
        i = i + 1
        k = N
        while k >= 1 {
            print(" \(c[k])", separator: "", terminator: "")
            k = k - 1
        }
        print()
        k = 1
        while c[k] == k {
            c[k] = 0
            k = k + 1
        }
        c[k] = c[k] + 1
    } while k <= N
}

factorial()


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

黄金分割法 golden section search

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

黄金分割法 golden section search
実行:Playground

import Foundation

func goldsect( a:inout Double, b:inout Double, tolerance:Double, f:((Double) -> Double)) -> Double {
    let r:Double = 2 / (3 + sqrt(5.0));
    if a > b {
        swap(&a, &b)
    }
    let t = r * (b - a)
    var c = a + t
    var d = b - t
    var fc = f(c)
    var fd = f(d)
    while(true) {
        if fc > fd {
            a = c
            c = d
            fc = fd
            d = b - r * (b - a)
            if d - c <= tolerance {
                return c
            }
            fd = f(d)
        }
        else {
            b = d
            d = c
            fd = fc
            c = a + r * (b - a)
            if d - c <= tolerance {
                return d
            }
            fc = f(c)
        }
    }
}

var a = 1.0
var b = 10.0
print("結果 = \(goldsect(a: &a, b: &b, tolerance: 0, f: {$0 * $0 - 2}))")


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

円周率2 pi

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

異性体の問題 counting isomers
実行:Playground

import Foundation

func pi2() -> Double {
    var a:Double = 1
    var b:Double = 1 / sqrt(2)
    var s:Double = 1
    var t:Double = 4
    
    for _ in 1..<3 {
        let last = a
        a = (a + b) / 2
        b = sqrt(last * b)
        s -= t * (a - last) * (a - last)
        t *= 2
    }
    return (a + b) * (a + b) / s
}

print("相加相乗平均")
print("円周率:\(pi2())")


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

円周率 pi

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

円周率 pi
実行:Playground

func pi() -> Double {
    var k:Double = 1
    var p:Double = 0.0
    var t:Double = 16.0 / 5.0
    var last:Double
    
    repeat {
        last = p
        p += (t / k)
        t /= -5.0 * 5.0
        k += 2
    } while p != last
    
    k = 1.0
    t = 4.0 / 239.0
    repeat {
        last = p
        p -= t / k
        t /= -239.0 * 239
        k += 2
    } while p != last
    return p
}

print("Machin公式")
print("円周率:\(pi())")


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

エジプトの分数 Egyptian fractions

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

異性体の問題 counting isomers
実行:Command Line

import Foundation

/// 入力
/// - parameter メッセージ
/// - returns 入力文字列
func input(msg:String = "") -> String {
    print(msg, separator: "", terminator: "")
    let indata = FileHandle.standardInput;
    let rawdata = indata.availableData;
    let str = NSString(data: rawdata, encoding: String.Encoding.utf8.rawValue);
    let length = str?.length
    let result = str?.substring(with: NSRange(location: 0,length: length! - 1))
    return result!
}

var m = Int(input(msg: " 分子 m = "))!
var n = Int(input(msg: " 分母 n = "))!
print("\(m)/\(n) = ")
var q:Int
while n % m != 0 {
    q = n / m + 1
    print("1/\(q) + ")
    m = m * q - n
    n *= q
}
print("1/\(n / m)")


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

異性体の問題 counting isomers

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング。

異性体の問題 counting isomers
実行:Playground※但し時間がかかります。Command Lineが現実的です。

let C = 17
let L = 2558
var size = [Int](repeating: 0, count: L)
var length = [Int](repeating: 0, count: L)
var count = [Int](repeating: 0, count: C + 1)

func isomer() -> Bool {
    var n = 0
    var len = 0
    
    for i in 0..<L {
        len = length[i] + 1
        if len > C / 2 {
            break
        }
        let si = size[i] + 1
        if si + len > C {
            continue
        }
        for j in 0...i {
            let sj = si + size[j]
            if sj + len > C {
                continue
            }
            for k in 0...j {
                let sk = sj + size[k]
                if sk + len > C {
                    continue
                }
                n = n + 1
                if n >= L {
                    return false
                }
                size[n] = sk
                length[n] = len
            }
        }
    }
    if len <= C / 2 {
        return false
    }
    for i in 0...n {
        let si = size[i]
        for j in 0...i {
            if length[i] != length[j] {
                continue
            }
            let sj = si + size[j]
            if sj > C {
                continue
            }
            count[sj] = count[sj] + 1
            for k in 0...j {
                let sk = sj + size[k] + 1
                if sk > C {
                    continue
                }
                for h in 0...k {
                    let sh = sk + size[h]
                    if sh <= C {
                        count[sh] = count[sh] + 1
                    }
                }
            }
        }
    }
    for i in 1...C {
        print("炭素原子が \(i) 個のものは \(count[i]) 種類")
    }
    return true
}

print(isomer())


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)