LoginSignup
6
1

More than 3 years have passed since last update.

Elixir で約数のリストを返す

Posted at

任意の「正の整数」値を渡し、その値の「約数のリスト」を返す関数をElixirで作成してみた。
Elixirの「1.9.0」で動作確認済み。

yks = fn x -> v = x; 1..v |> Enum.filter(fn n -> rem(v, n) == 0 end) end

以下、処理内容。

  • 引数 x の値を v に代入
  • 1..v で、1から最大値 v までのRangeを作成し、パイプ演算子で Enum.filter/2に渡す
  • Enum.filter/2内の関数では、引数 n を 剰余を求める関数 rem/2 で 「rem(v,n) == 0」 になった値だけを残す

課題としては、以下がある。

  • 引数が「正の整数値」以外の考慮がない
  • 引数に渡す値が大きくなれば、処理時間がかかるようになる

課題については、必要になったら考える。

次に、動作確認をしてみる。

iex> yks.(10)
[1, 2, 5, 10]
iex> yks.(25)
[1, 5, 25]
iex> yks.(50)
[1, 2, 5, 10, 25, 50]
iex> yks.(75)
[1, 3, 5, 15, 25, 75]
iex> yks.(100)
[1, 2, 4, 5, 10, 20, 25, 50, 100]

動き自体は大丈夫そうなので、今度は1から100の値を投入してみる。
ここで、どの値が分かりやすいように、約数のリストは逆順に並べておく。
リストの逆順は、Enum.reverse/1 で実施する。

1..100 |> Enum.map(yks) |> Enum.map(fn r -> Enum.reverse(r) end)

以下、実行結果。

[
  [1],
  [2, 1],
  [3, 1],
  [4, 2, 1],
  [5, 1],
  [6, 3, 2, 1],
  [7, 1],
  [8, 4, 2, 1],
  [9, 3, 1],
  [10, 5, 2, 1],
  [11, 1],
  [12, 6, 4, 3, 2, 1],
  [13, 1],
  [14, 7, 2, 1],
  [15, 5, 3, 1],
  [16, 8, 4, 2, 1],
  [17, 1],
  [18, 9, 6, 3, 2, 1],
  [19, 1],
  [20, 10, 5, 4, 2, 1],
〜(以下略)〜

おまけ1: 約数の「数」を算出する場合

各要素数のリストを対象として、Enum.reduce/3 で単純に個数をカウントする。

yss = fn p -> Enum.reduce(p, 0, fn(_, acc) -> acc + 1 end) end
1..100 |> Enum.map(yks) |> Enum.map(yss)

以下、実行結果。

[1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, 3, 4,
 4, 6, 2, 8, 2, 6, 4, 4, 4, 9, 2, 4, 4, 8, 2, 8, 2, 6, 6, 4, 2, 10, 3, 6, ...]

おまけ2: 1から100までの約数一覧

1から100までの約数の一覧パターンを乗せておく。

  • :key が正の整数値
  • :list が約数の一覧
  • :yososu が要素の数
1..100 |>
Enum.map(yks) |>
Enum.map(fn r -> Enum.reverse(r) end) |>
Enum.map( fn [h | t] -> %{:key =>h, :yososu => yss.([h|t]) , :list => [h | t]} end)

以下、実行結果。

[
  %{key: 1, list: [1], yososu: 1},
  %{key: 2, list: [2, 1], yososu: 2},
  %{key: 3, list: [3, 1], yososu: 2},
  %{key: 4, list: [4, 2, 1], yososu: 3},
  %{key: 5, list: [5, 1], yososu: 2},
  %{key: 6, list: [6, 3, 2, 1], yososu: 4},
  %{key: 7, list: [7, 1], yososu: 2},
  %{key: 8, list: [8, 4, 2, 1], yososu: 4},
  %{key: 9, list: [9, 3, 1], yososu: 3},
  %{key: 10, list: [10, 5, 2, 1], yososu: 4},
  %{key: 11, list: [11, 1], yososu: 2},
  %{key: 12, list: [12, 6, 4, 3, 2, 1], yososu: 6},
  %{key: 13, list: [13, 1], yososu: 2},
  %{key: 14, list: [14, 7, 2, 1], yososu: 4},
  %{key: 15, list: [15, 5, 3, 1], yososu: 4},
  %{key: 16, list: [16, 8, 4, 2, 1], yososu: 5},
  %{key: 17, list: [17, 1], yososu: 2},
  %{key: 18, list: [18, 9, 6, 3, 2, 1], yososu: 6},
  %{key: 19, list: [19, 1], yososu: 2},
  %{key: 20, list: [20, 10, 5, 4, 2, 1], yososu: 6},
  %{key: 21, list: [21, 7, 3, 1], yososu: 4},
  %{key: 22, list: [22, 11, 2, 1], yososu: 4},
  %{key: 23, list: [23, 1], yososu: 2},
  %{key: 24, list: [24, 12, 8, 6, 4, 3, 2, 1], yososu: 8},
  %{key: 25, list: [25, 5, 1], yososu: 3},
  %{key: 26, list: [26, 13, 2, 1], yososu: 4},
  %{key: 27, list: [27, 9, 3, 1], yososu: 4},
  %{key: 28, list: [28, 14, 7, 4, 2, 1], yososu: 6},
  %{key: 29, list: [29, 1], yososu: 2},
  %{key: 30, list: [30, 15, 10, 6, 5, 3, 2, 1], yososu: 8},
  %{key: 31, list: [31, 1], yososu: 2},
  %{key: 32, list: [32, 16, 8, 4, 2, 1], yososu: 6},
  %{key: 33, list: [33, 11, 3, 1], yososu: 4},
  %{key: 34, list: [34, 17, 2, 1], yososu: 4},
  %{key: 35, list: [35, 7, 5, 1], yososu: 4},
  %{key: 36, list: [36, 18, 12, 9, 6, 4, 3, 2, 1], yososu: 9},
  %{key: 37, list: [37, 1], yososu: 2},
  %{key: 38, list: [38, 19, 2, 1], yososu: 4},
  %{key: 39, list: [39, 13, 3, 1], yososu: 4},
  %{key: 40, list: [40, 20, 10, 8, 5, 4, 2, 1], yososu: 8},
  %{key: 41, list: [41, 1], yososu: 2},
  %{key: 42, list: [42, 21, 14, 7, 6, 3, 2, 1], yososu: 8},
  %{key: 43, list: [43, 1], yososu: 2},
  %{key: 44, list: [44, 22, 11, 4, 2, 1], yososu: 6},
  %{key: 45, list: [45, 15, 9, 5, 3, 1], yososu: 6},
  %{key: 46, list: [46, 23, 2, 1], yososu: 4},
  %{key: 47, list: [47, 1], yososu: 2},
  %{key: 48, list: [48, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 10},
  %{key: 49, list: [49, 7, 1], yososu: 3},
  %{key: 50, list: [50, 25, 10, 5, 2, 1], yososu: 6},
  %{key: 51, list: [51, 17, 3, 1], yososu: 4},
  %{key: 52, list: [52, 26, 13, 4, 2, 1], yososu: 6},
  %{key: 53, list: [53, 1], yososu: 2},
  %{key: 54, list: [54, 27, 18, 9, 6, 3, 2, 1], yososu: 8},
  %{key: 55, list: [55, 11, 5, 1], yososu: 4},
  %{key: 56, list: [56, 28, 14, 8, 7, 4, 2, 1], yososu: 8},
  %{key: 57, list: [57, 19, 3, 1], yososu: 4},
  %{key: 58, list: [58, 29, 2, 1], yososu: 4},
  %{key: 59, list: [59, 1], yososu: 2},
  %{key: 60, list: [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1], yososu: 12},
  %{key: 61, list: [61, 1], yososu: 2},
  %{key: 62, list: [62, 31, 2, 1], yososu: 4},
  %{key: 63, list: [63, 21, 9, 7, 3, 1], yososu: 6},
  %{key: 64, list: [64, 32, 16, 8, 4, 2, 1], yososu: 7},
  %{key: 65, list: [65, 13, 5, 1], yososu: 4},
  %{key: 66, list: [66, 33, 22, 11, 6, 3, 2, 1], yososu: 8},
  %{key: 67, list: [67, 1], yososu: 2},
  %{key: 68, list: [68, 34, 17, 4, 2, 1], yososu: 6},
  %{key: 69, list: [69, 23, 3, 1], yososu: 4},
  %{key: 70, list: [70, 35, 14, 10, 7, 5, 2, 1], yososu: 8},
  %{key: 71, list: [71, 1], yososu: 2},
  %{key: 72, list: [72, 36, 24, 18, 12, 9, 8, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 73, list: [73, 1], yososu: 2},
  %{key: 74, list: [74, 37, 2, 1], yososu: 4},
  %{key: 75, list: [75, 25, 15, 5, 3, 1], yososu: 6},
  %{key: 76, list: [76, 38, 19, 4, 2, 1], yososu: 6},
  %{key: 77, list: [77, 11, 7, 1], yososu: 4},
  %{key: 78, list: [78, 39, 26, 13, 6, 3, 2, 1], yososu: 8},
  %{key: 79, list: [79, 1], yososu: 2},
  %{key: 80, list: [80, 40, 20, 16, 10, 8, 5, 4, 2, 1], yososu: 10},
  %{key: 81, list: [81, 27, 9, 3, 1], yososu: 5},
  %{key: 82, list: [82, 41, 2, 1], yososu: 4},
  %{key: 83, list: [83, 1], yososu: 2},
  %{key: 84, list: [84, 42, 28, 21, 14, 12, 7, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 85, list: [85, 17, 5, 1], yososu: 4},
  %{key: 86, list: [86, 43, 2, 1], yososu: 4},
  %{key: 87, list: [87, 29, 3, 1], yososu: 4},
  %{key: 88, list: [88, 44, 22, 11, 8, 4, 2, 1], yososu: 8},
  %{key: 89, list: [89, 1], yososu: 2},
  %{key: 90, list: [90, 45, 30, 18, 15, 10, 9, 6, 5, 3, 2, 1], yososu: 12},
  %{key: 91, list: [91, 13, 7, 1], yososu: 4},
  %{key: 92, list: [92, 46, 23, 4, 2, 1], yososu: 6},
  %{key: 93, list: [93, 31, 3, 1], yososu: 4},
  %{key: 94, list: [94, 47, 2, 1], yososu: 4},
  %{key: 95, list: [95, 19, 5, 1], yososu: 4},
  %{key: 96, list: [96, 48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 12},
  %{key: 97, list: [97, 1], yososu: 2},
  %{key: 98, list: [98, 49, 14, 7, 2, 1], yososu: 6},
  %{key: 99, list: [99, 33, 11, 9, 3, 1], yososu: 6},
  %{key: 100, list: [100, 50, 25, 20, 10, 5, 4, 2, 1], yososu: 9}
]
6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1