数学

約数を求める(Ruby)

prime ライブラリを使う。結果は順不同。 require "prime" def divisors(n) result = [1] doit = ->(pd, acc) { return if pd.empty? x, *xs = pd (0..x[1]).each do |i| e = acc * x[0] ** i result << e doit.(xs, e) end } doit.(n.prime_division, 1) re…

パスカルの三角形(Elixir)

obelisk.hatenablog.com ここで Ruby でやっていることを、Elixir でやってみました。 こういうのを表示します。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 コード pascal_triangle.exs defmodule PascalTriangle …

Ruby でコラッツの問題

ja.wikipedia.org 「コラッツの問題」というのは、自然数 n を取り、 n が偶数なら2で割る n が奇数なら、3倍して1を足す という操作を繰り返したところ、どうなるかという問題。じつはこれは難問で、いまだに解決されていない。いまのところ、初期値が268あ…

いまどきの Ruby なフィボナッチ数列

Enumerator.produceを使います。 fib = Enumerator.produce([1, 1]) { |a, b| [b, a + b] }.lazy.map(&:first) #最初の10個 fib.first(10) #=>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] #数列の100以上3000未満の部分 fib.drop_while { _1 < 100 }.take_while { _…

関数を微分して gnuplot で出力(Ruby)

コード。 require "numo/gnuplot" dx = 0.0001 dif = ->(f, x) { (f.(x+dx)-f.(x))/dx }.curry f = ->(x) { x*x-2*x+1 } dif_f = dif.(f) xs = -5.step(5, 0.1).to_a ys1 = xs.map(&f) ys2 = xs.map(&dif_f) Numo.gnuplot do set terminal: :x11 unset :key …

Enumerator::Lazy でエラトステネスの篩(Ruby)

Enumerator::Lazy は無限数列を扱うことができるが、それを使って「エラトステネスの篩」をちょっとおもしろく実装できることに気づいた。何はともあれコードである。lazy_prime.rb prime_seq = Enumerator.new do |y| sieve = 2.step.lazy loop do a = siev…

mod p の世界における割り算とは(Ruby)

qiita.com mod p における「逆元」を考えるとよいそう。Ruby で実装する(元は C++)。 def modinv(a, m) b, u, v = m, 1, 0 until b.zero? t = a / b a -= t * b a, b = b, a u -= t * v u, v = v, u end u %= m u += m if u < 0 u end

自然数の約数の個数(Ruby)

自然数の約数の個数は、素因数分解をして求める。Ruby なら、prime ライブラリを require して、Inetger#prime_divisionメソッドを使う。 require "prime" n = 360 puts n.prime_division.inject(1) {|acc, (a, b)| acc * (b + 1)} #=>24

Ruby で簡単な Gray-Scott

qiita.comここの Python 版を Ruby に移植しただけです。計算に Gem 'numo-narray' を使っています。画像化には Gem 'gdk_pixbuf2', 'rmagick' を使いました。できたものはこんな感じ。 Ruby コード。Ruby 2.6.0, Linux Mint 19.2 で動作確認。 gray_scott.r…

Ruby でマンデルブロ集合を描画

qiita.comQiita 記事を見てやってみたくなりました。ほとんどパクリです。Numo::NArray を使っています。 実行結果。 コード。 mandelbrot_narray.rb require 'numo/narray' require 'gdk_pixbuf2' include Numo MaxCalc = 5000 #最大計算回数(数字が大きい…

チャーチ数の簡単な計算(Ruby)

Wikipedia の OCaml の項目を読んでいたら、OCaml ではチャーチ数の計算がきれいに書けることを知った。 let zero f x = x let succ n f x = f (n f x) let one = succ zero let two = succ (succ zero) let add n1 n2 f x = n1 f (n2 f x) let to_int n = n…

線分の交点(Ruby)

4点 があるとき、線分 と の交点を求めるメソッド。 require 'matrix' def cross(x1, y1, x2, y2, x3, y3, x4, y4) a = Matrix[[x2 - x1, x3 - x4], [y2 - y1, y3 - y4]] .lup.solve([x3 - x1, y3 - y1]) rescue nil return nil unless a s, t = a[0], a[1] …

Ruby と rcairo でベジェ曲線を描いてみる

ベジェ曲線(Wikipedia)は滑らかな曲線を描くために使われるものです。いくつかの「制御点」を指定して描きます。計算はそんなにむずかしくなくて、上の Wikipedia の記事で充分わかりますし、ネット上にわかりやすい記事がたくさんあるので検索してみて下…

線分への垂線の足を求める(Ruby)

点 P から線分 AB への垂線の足 H を求めます。Ruby の標準添付ライブラリ 'Matrix' を使います。コード。 require 'matrix' def perpendicular_foot(a, b, p) s = Rational((p - a).dot(b - a), (b - a).dot(b - a)) [h = a + (b - a) * s, s, (h - p).norm…

四則演算のパーサー(Ruby)

ある問題を解いていて、四則演算のパーサーってどんな風に書くのだろうと思って考えてみました。いわゆる「逆ポーランド記法」にパースできればあとは簡単なので、その方針で考えたのですが、自力ではちょっと荷が重かったですね。ということで検索してみた…

Ruby/SDL でランダム・ウォーク

Ruby/SDL(参照)を使ってランダム・ウォークしてみました。Linux Mint 19、Ruby 2.5.1 で確認しました。コード。 sdl_random_walk.rb require_relative 'sdl_draw' WindowWidth = 300 FieldWidth = 50.0 N = 30 class Agent def initialize(ob) @x = @y = 0…

平方根(ルート)を計算して遊ぶライブラリを作った(Ruby)

遊びで平方根(二乗根)を扱うクラス(Root)を Ruby で書いてみました。三乗根とかそれ以上は扱えません(笑)。コードは下(Gist)にあります。 平方根の計算 · GitHub オブジェクトの生成。Integer, Rational, Float のルートが扱えます。Root.new(n) ま…

高速な素数の判定(Ruby)

素数は約数を 2個(1 とそれ自身)もつ自然数ですね。ですから、自然数 n が素数かどうかを判定するには、n がそれ自身より小さい自然数(1 を除く)で割ることができるかどうかを確かめればよいわけです。このとき、割る数は を超える必要がないことは明ら…

素因数分解(Ruby)

素因数分解は結局素数で順に割っていくしかないのだけれど、素数をわざわざ求めてというのは却って大変ですね。うまいやり方としては、2 および 3 以上の奇数で割るという方法があります。これは多少のムダは出るけど、全部の数で割るより効率的ですね。さら…

L-system で描いた再帰曲線の例

obelisk.hatenablog.com 前回のエントリで Ruby で実装してみた L-system を使って、実際に再帰曲線を描いてみます。Gem 'kaki-lsystem' が必要です。 C曲線。 コード。 require 'kaki/lsystem' l = Lsystem.new(600, 500, "C curve") l.move(-130, 100) l.p…

再帰曲線を描く言語「L-system」を Ruby で実装した

L-system って何でしょうか。Wikipedia にはこうあります。 L-system(エルシステム、Lindenmayer system)は形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズムである。自然物の他にも、反復関数系(Itera…

ジュリア集合を描いてみる(Ruby)

ジュリア集合(Julia set)を Ruby で描いてみました。 描画には自作の Gem 'oekaki' を使っています。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura コード。 julia_set.rb require 'oekaki' Width, …

タートルグラフィックスで再帰曲線をいろいろ描いてみる(Ruby)

Ruby で簡単なタートルグラフィックスを実装して、いろいろ再帰曲線を描いてみました。描画には自作の Gem 'oekaki' を使っています。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみた(Ruby) - Camera Obscura ※追記 Gem化しまし…

パスカルの三角形(Ruby)

パスカルの三角形とは、こんな感じのものです。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 規則性がわかりますね。多項式 (a + b)n を展開すると、係数がこんな風に並びます。Ruby で関数型プログラミングっぽく書…

n進グレイコード(Ruby)

ゆえあって n進グレイコードへの変換式を作ることになった。 グレイコード - Wikipedia グレイコードについてはここにあるとおりである。2進グレイコードなら、ネットを検索すればたくさん出てくる。具体例は、Ruby のハッシュで表すとこんな感じだ。 {"0"=>…

「シェルピンスキーのギャスケット」を描いてみる(Ruby)

「シェルピンスキーのギャスケット」を Ruby で描いてみました。 フラクタルな図形なので正確ではないですが、7次まで描いてみました。描画には自作の Gem 'oekaki' を使っています。 oekaki | RubyGems.org | your community gem host GTK+でお絵かきしてみ…

スプライン曲線を描く(Ruby)

複数の点をなめらかにつなぐ「スプライン曲線」を描いてみました。全体的に下のサイトを参考にしました(ありがとうございます!) Ruby - 3次スプライン補間! - mk-mode BLOG gnuplot で出力してみるとこんな感じです。 spline_curve.rb require 'numo/gn…

Ruby FFI でエラトステネスの篩

これまで Ruby と C言語で「エラトステネスの篩」を書いたので、Ruby FFI で融合させてみました。Ruby FFI で簡単に Ruby から C言語の関数を呼ぶことができます。Linux Mint 18.2, Ruby 2.3.3 で確認しました。Ruby FFI を使うには libffi が必要ですが、Li…

Swift でエラトステネスの篩

こんな感じ。 eratosthenes.swift func eratosthenes(_ n: Int) -> [Int] { var ar = Array(0...n) for i in 2...Int(sqrt(Double(n))) { if ar[i] == 0 {continue} for j in 2...(n / i) {ar[i * j] = 0} } return ar.filter {$0 != 0} } print(eratosthene…

Ruby で循環小数を扱う

以前にも同様の試みをしたのですが(参照)、コードを始めから書き直しました。以前のは何か自分でもよくわからない、面倒なことをしているので。作ったのは Rational#to_rec_decimal と String#to_r で、前者は Rational(分数)を(String で表される)循…