SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
SpeeeKaigi資料
hayato_iida August 25, 2017 3:32 p.m.
PJD飯田勇人
一応iOSエンジニア
最近はrails書いたり社内業務分析みたいな仕事
新宿のVR行きたい
Swiftに複素数を実装する
Riemann球面とは
Riemann球面を実装する
演算子を新たに定義できる
既存型にprotocolを追加出来る
既存の演算子の処理を上書きする事もできる
.swift
SwiftでRiemann球面を扱う
自己紹介
導入
ちょっとした関数を計算したいときに何を使いますか?
playgroundでSwiftをさくっと書きますよね?
色々値を代入したあとは複素数を代入したくなりますよ
ね?
Swiftには複素数がない!
じゃ作ろう
目次
Swiftで数学を実装
// Intの足し算を掛け算に変える
protocol X {
static func +(a: Self, b: Self) -> Self
}
extension Int:X{
static func +(a: Int, b: Int) -> Int {
return a * b
}
}
10 + 10 // 100
Complex型を作る
極座標形式で実装
.swift
public struct Complex {
public let angle: Double // 偏角
public let radius: Double // 絶対値
}
実部、虚部
.swift
public var real: Double {
get {
return radius * cos(angle)
}
}
public var imaginary: Double {
get {
return radius * sin(angle)
}
}
初期化
.swift
public init(angle: Double, radius: Double) {
self.radius = radius
self.angle = angle
}
public init(real: Double, imaginary: Double) {
let radius = sqrt(real * real + imaginary * imaginary)
let angle = atan2(imaginary, real)
self.init(angle: angle, radius: radius)
}
.swift
複素数を実装する
複素数の定義
便利に使うAPIを追加
Complex(angle: pi / 2, radius: 1) // i
Complex(real: 1, imaginary: 1) // 1 + i
定数
.swift
let pi = Double.pi
let i = Complex(angle: pi / 2, radius: 1)
加算
減算
乗算
除算
加算
.swift
extension Complex {
static public func +(a: Complex, b: Complex) -> Complex {
return Complex(real: a.real + b.real, imaginary: a.imaginary + b.imaginary)
}
}
減算
.swift
extension Complex {
static public func -(a: Complex, b: Complex) -> Complex {
return Complex(real: a.real - b.real, imaginary: a.imaginary - b.imaginary)
}
}
乗算
.swift
extension Complex {
static public func *(a: Complex, b: Complex) -> Complex {
return Complex(angle: a.angle + b.angle, radius: a.radius * b.radius)
}
}
除算
.swift
演算の定義
加減乗除を定義する
Swift実装
extension Complex {
static public func /(a: Complex, b: Complex) -> Complex {
return Complex(angle: a.angle - b.angle, radius: a.radius / b.radius)
}
}
.swift
i * i // == -1
let x = Complex(angle:pi / 4, radius:1)
let y = Complex(angle:-pi / 4, radius:1)
x * y // == 1
.swift
1 + i
1 / i
(1 + i) * (1.0 - i)
「Complex型に変換可能」なprotocol(Complexable)を定義
Int,Double,Floatにextensionで差し込む
Complexable型の演算として定義しなおす
Complex型同士の演算はできた
数値とComplex型の演算をしたい
こうしたい
数値型と統合する
設計
クラス図
実装
.swift
public protocol Complexable {
func asComplex() -> Complex
}
extension Int: Complexable {
public func asComplex() -> Complex {return Complex(Double(self))}
}
extension Float: Complexable {
public func asComplex() -> Complex {return Complex(Double(self))}
}
extension Double: Complexable {
public func asComplex() -> Complex {return Complex(self)}
}
public struct Complex: Complexable {
・・・
public func asComplex() -> Complex {
return self
}
}
.swift
public struct Complex: Complexable {
・・・
static public func +(a: Complex, b: Complexable) -> Complex {
return a.asComplex() + b.asComplex()
}
static public func +(a: Complexabe, b: Complex) -> Complex {
return a.asComplex() + b.asComplex()
}
}
他の演算も同様に実装する
Swift2製のが多い
Riemann球面にしたい
.swift
1/0 // 無限大?
IEEE754「浮動小数点数算術標準」
できた
既存の複素数ライブラリの課題
Riemann球面
ゼロ除算
浮動小数点のゼロ除算の定義が含まれる
[https://ja.wikipedia.org/wiki/ゼロ除算] より
近づける方向によって発散の方向が違う
符号付きゼロ(+0,-0)を定義
+0 正の値から近づける
.swift
1/+0 // infinity
-0 負の値から近づける
.swift
1/-0 // - infinity
前提として実数には∞,-∞という値は含まれない
IEEE754
実数に∞,-∞の2点を追加した集合をFloatにする
Floatが有限であることには一旦目をつぶる
(1+i) / 0 = ∞ + ∞i // ?
-(1+i) / 0 = -∞ + -∞i // ?
∞か-∞か
実数上での理解
複素数のゼロ除算をどう定義するか?
無限に存在する?
Rなら2点{∞,-∞}足せば済んだ
無限に点を追加する?
しかも不可算無限個ある
∞を無限遠点として
ただしこの無限遠点はRの時の∞ではないことに注意
Riemann球面
無限遠点の演算
すでにCの演算は実装済み
上記の無限遠点にまつわる演算を実装すればリーマン球面を実装したと言える
TDDで実装する
.swift
let inf = Complex.infinity
let nan = Complex.nan
assert(inf != nan)
assert(inf == inf)
assert(inf != z)
assert(inf + z == inf)
assert(z + inf == inf)
assert(0 + inf == inf + 0)
assert(0 + inf == inf)
assert((inf + inf).isNan)
assert(inf - z == inf)
assert(z - inf == inf)
assert(0 - inf == inf - 0)
assert(0 - inf == inf)
assert((inf - inf).isNan)
assert(z * inf == inf * z)
assert(z * inf == inf)
assert((0 * inf).isNan)
assert((inf * 0).isNan)
assert(inf * inf == inf)
assert(i / 0 == inf)
assert(z / 0 == inf)
assert(1 / inf == 0)
assert(0 / z == 0)
assert((inf / inf).isNan)
.swift
extension Complex {
static public let infinity = Complex(angle: Double.nan, radius: Double.infinit
y)
static public let nan = Complex(angle: Double.nan, radius: Double.nan)
static public func +(a: Complex, b: Complex) -> Complex {
if a.isInfinite && b.isInfinite {
return Complex.nan
} else if a.isInfinite || b.isInfinite {
return Complex.infinity
} else if a.isNan || b.isNan {
return Complex.nan
}
return Complex(real: a.asComplex().real + b.asComplex().real, imaginary: a.a
sComplex().imaginary + b.asComplex().imaginary)
}
}
他の演算子にも同様に実装して
実装
実装
実装
Swiftのライブラリにしました
github:SwiftRiemannSphere
playgroundも同梱しているのでデモはそちらで
複素数をリーマン球面上の演算として扱いたい
ただし実装としては計算に追加処理がかかるので計算機としては非効率
必要な範囲で選択的にリーマン球面を扱えるようにしたい
ライブラリ化することで import したコードにだけ適用出来る
Swift4対応で書いているので今後のSwiftの仕様変更にも強い
数学の定義をそのまま実装したので応用数学でも有効に使えるはず
総括

Contenu connexe

Tendances

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
 

Tendances (20)

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
TypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)ScriptTypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
TypeScriptのススメ ~JavaエンジニアのためのJava(like)Script
 
GoF デザインパターン 2009
GoF デザインパターン 2009GoF デザインパターン 2009
GoF デザインパターン 2009
 
P5utda day3
P5utda day3P5utda day3
P5utda day3
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
 
Lispとは何なのか - 同図像性がもたらす力とその利用法
Lispとは何なのか - 同図像性がもたらす力とその利用法Lispとは何なのか - 同図像性がもたらす力とその利用法
Lispとは何なのか - 同図像性がもたらす力とその利用法
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
Lisper はじめました (再)
Lisper はじめました (再)Lisper はじめました (再)
Lisper はじめました (再)
 
Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2Akka Stream x Kinesis at Shinjuku reactive meetup vol2
Akka Stream x Kinesis at Shinjuku reactive meetup vol2
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
Lisperはじめました
LisperはじめましたLisperはじめました
Lisperはじめました
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)
 
Lispの同図像性とその周辺
Lispの同図像性とその周辺Lispの同図像性とその周辺
Lispの同図像性とその周辺
 
Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要Visual studio 14 CTP2 概要
Visual studio 14 CTP2 概要
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 

En vedette

En vedette (20)

言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-
言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-
言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-
 
[ICLR2017読み会 @ DeNA] ICLR2017紹介
[ICLR2017読み会 @ DeNA] ICLR2017紹介[ICLR2017読み会 @ DeNA] ICLR2017紹介
[ICLR2017読み会 @ DeNA] ICLR2017紹介
 
医療データ解析界隈から見たICLR2017
医療データ解析界隈から見たICLR2017医療データ解析界隈から見たICLR2017
医療データ解析界隈から見たICLR2017
 
170614 iclr reading-public
170614 iclr reading-public170614 iclr reading-public
170614 iclr reading-public
 
Q prop
Q propQ prop
Q prop
 
Xcode のローカライズ処方箋 #yhios
Xcode のローカライズ処方箋 #yhiosXcode のローカライズ処方箋 #yhios
Xcode のローカライズ処方箋 #yhios
 
シェアリングエコノミー協会 ご入会案内
シェアリングエコノミー協会 ご入会案内シェアリングエコノミー協会 ご入会案内
シェアリングエコノミー協会 ご入会案内
 
シェアリングエコノミーによる持続可能型の新しい社会の実現(上田祐司)
シェアリングエコノミーによる持続可能型の新しい社会の実現(上田祐司)シェアリングエコノミーによる持続可能型の新しい社会の実現(上田祐司)
シェアリングエコノミーによる持続可能型の新しい社会の実現(上田祐司)
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
 
[DL輪読会]Deep Direct Reinforcement Learning for Financial Signal Representation...
[DL輪読会]Deep Direct Reinforcement Learning for Financial Signal Representation...[DL輪読会]Deep Direct Reinforcement Learning for Financial Signal Representation...
[DL輪読会]Deep Direct Reinforcement Learning for Financial Signal Representation...
 
Agile overview
Agile overviewAgile overview
Agile overview
 
エンジニアがデザインやってみた @ Aimning MeetUp 2017/10
エンジニアがデザインやってみた @ Aimning MeetUp 2017/10エンジニアがデザインやってみた @ Aimning MeetUp 2017/10
エンジニアがデザインやってみた @ Aimning MeetUp 2017/10
 
エフェクト用 Shader 機能紹介
エフェクト用 Shader 機能紹介エフェクト用 Shader 機能紹介
エフェクト用 Shader 機能紹介
 
エフェクトにしっかり色を付ける方法
エフェクトにしっかり色を付ける方法エフェクトにしっかり色を付ける方法
エフェクトにしっかり色を付ける方法
 
確率的プログラミングライブラリEdward
確率的プログラミングライブラリEdward確率的プログラミングライブラリEdward
確率的プログラミングライブラリEdward
 
(DL hacks輪読)Bayesian Neural Network
(DL hacks輪読)Bayesian Neural Network(DL hacks輪読)Bayesian Neural Network
(DL hacks輪読)Bayesian Neural Network
 
当たり前を当たり前に:Agile2017レポート
当たり前を当たり前に:Agile2017レポート当たり前を当たり前に:Agile2017レポート
当たり前を当たり前に:Agile2017レポート
 
ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena
ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @DenaICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena
ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena
 
ICLR読み会 奥村純 20170617
ICLR読み会 奥村純 20170617ICLR読み会 奥村純 20170617
ICLR読み会 奥村純 20170617
 
Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会
Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会
Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会
 

Similaire à SwiftでRiemann球面を扱う

関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04
Minoru Chikamune
 

Similaire à SwiftでRiemann球面を扱う (20)

Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料
Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料
Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 

Dernier

Dernier (11)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

SwiftでRiemann球面を扱う