裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

因数分解

2015年04月14日 | ブログラミング

二次式 αx^2+βx+γ を (ax+b)(cx+d) の形に因数分解せよと

func = function(a, b, c) {
##
  factorize = function(n) {
    div = function(n) {
      if (n%%2 == 0) return(2)
      else if (n%%3 == 0) return(3)
      maxitr = floor(sqrt(n))
      i = 1
      repeat {
        i = i + 4
        if (i > maxitr) return(n)
        else if (n%%i == 0) return(i)
        i = i + 2
        if (i > maxitr) return(n)
        else if (n%%i == 0) return(i)
      }
    }
    result = NULL
    repeat {
      d = div(n)
      result = append(result, d)
      n = n/d
      if (n == 1) break
    }
    return(result)
  }
##
  is.int = function(x) {
      result = all.equal(x, floor(x))
      return(ifelse(class(result) == "character", FALSE, TRUE))
  }
##
  if (0 > a) {
      a = -a; b = -b; c = -c
  }
  if (a == 0) return("Error")
  d = b^2-4*a*c
  if (0 > d) return("Error")
  if (b >= 0) {
    x1 = (-b - sqrt(d)) / 2 / a
  } else {
    x1 = (-b + sqrt(d)) / 2 / a
  }
  x2 = (c / a) / x1
##
  result = factorize(a)
  n = length(result)
  ans = ""
  for (i in 1:2^n) {
    factor = prod(result[as.integer(intToBits(i-1))[1:n] == 1])
    if (is.int(factor * x1) && is.int((a / factor) * x2)) {
      ans = c(factor, -factor * x1, a / factor, -(a / factor) * x2)
      break
    }
  }
  return(ans)
}

> func(4, -23, 15) # 1, -5, 4, -3
[1]  1 -5  4 -3


> func(-4, 23, -15) # 1, -5, 4, -3
[1]  1 -5  4 -3

> func(3, 10, 3)   # 1,  3, 3,  1
[1] 1 3 3 1

> func(6, -1, -15) # 3, -5, 2,  3
[1]  3 -5  2  3

> func(12, -1, -6) # 4, -3, 3,  2
[1]  4 -3  3  2

> func(3, -8, 4)   # 1, -2, 3, -2
[1]  1 -2  3 -2

> func(3, 5, 7)    # Error 実数解はない
[1] "Error"

> func(268231, -374150, 128851) # 347, -269, 773, 479
[1]  347 -269  773 -479

> func(1, 1.0000000000000001, 0.0000000000000001) # "" 適切な解はない
[1] ""

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

暗号を解けという問題

2015年04月14日 | ブログラミング

長い文章があって,その後に数字ベクトルが来れば,そのベクトルは一番単純には文章中の文字の位置番号を表しているのだろうと思う罠。

> s = "春は、あけぼの。やうやう白くなりゆく、山ぎは少し明りて、紫だちたる雲のほそくたなびきたる。 夏は、夜。月のころはさらなり、闇もなほ、蛍の多く飛びちがひたる。また、ただ一つ二つなど、ほのかにうち光りて行くも、をかし。雨など降るも、をかし。 秋は、夕暮れ。夕日のさして、山の端いと近うなりたるに、烏の寝どころへ行くとて、三つ四つ、二つ三つなど、飛び急ぐさへあはれなり。まいて、雁などのつらねたるが、いと小さく見ゆるは、いとをかし。日入り果てて、風の音、虫の音(ね)など、はた言ふべきにあらず。 冬は、つとめて。雪の降りたるは言ふべきにもあらず。霜のいと白きも、またさらでも、いと寒きに、火など急ぎおこして、炭持て渡るも、いとつきづきし。昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりて、わろし。"
> w = unlist(strsplit(s, ""))
> w[c(85,42,241,10,7,104,17,195,37,95,244,235,30,212,197,25,195,137,140,31,94,266,89,33,298,138,107)]
 [1] "つ" "き" "あ" "う" "の" "を" "ゆ" "る" "そ" "う" "。" "た" "だ" "し" "、" "明" "る" "い" "う" "ち" "に" "も" "ど"
[24] "る" "こ" "と" "。"
> w[c(279,202,58,68,37,140,24)]
[1] "ま" "く" "ら" "の" "そ" "う" "し"

コメント
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村