附録二 累裁招差之法
著者:梅谷 武
附録二 累裁招差之法のプログラム一覧。
作成:2013-09-04
更新:2013-09-04
算譜A01 一次相乘之法 (sampA01.rb)
# coding: utf-8
require 'mathn'
require './poly1'
 
def 一次相乗之法( 限数, 定積 )
 
  len = 限数.length
 
  # 引数検査
  if 限数.kind_of?(Array)
    if len < 2
      raise ArgumentError, "一次相乗之法: 限数長不正"
    end
  else
    raise TypeError, "一次相乗之法: 限数型不正"
  end
  if 定積.kind_of?(Array)
    if len != 定積.length
      raise ArgumentError, "一次相乗之法: 定積長不正"
    end
  else
    raise TypeError, "一次相乗之法: 定積型不正"
  end
 
  平積法 = Array.new
  for i in 1..(len - 1)
    平積法.push( 限数[i] - 限数[i-1] )
  end
  平積実 = Array.new
  for i in 1..(len - 1)
    平積実.push( 定積[i] - 定積[i-1] )
  end
  平積 = Array.new
  for i in 0..(平積法.length - 1)
    平積.push( 平積実[i] / 平積法[i] )
  end
 
  # 平積恒等性判定
  flag = 1
  if 平積.length > 1
    for i in 1..(平積.length - 1)
      if 平積[0] != 平積[i] then
        flag = 0
      end
    end
  end
 
  # 数表出力
  p 限数; p 定積; p 平積法; p 平積実; p 平積
 
  # 結果
  if flag > 0
    return [ 定積[0] - 平積[0] * 限数[0], 平積[0] ]
  else
    return 0
  end
 
end
 
p Poly1( 一次相乗之法( [ 7, 11 ], [ 637/7, 957/11 ] ) )
p Poly1( 一次相乗之法( [ 5, 7, 16, 20 ], [ 15/5, 28/7, 136/16, 210/20 ] ) )
 sampA01.rbの実行結果
[7, 11]
[91, 87]
[4]
[-4]
[-1]
-X + 98
[5, 7, 16, 20]
[3, 4, (17/2), (21/2)]
[2, 9, 4]
[1, (9/2), 2]
[(1/2), (1/2), (1/2)]
1/2X + 1/2
算譜A02 二次相乘之法 (sampA02.rb)
# coding: utf-8
require 'mathn'
require './poly1'
 
def 二次相乗之法( 限数, 定積 )
 
  len = 限数.length
 
  # 引数検査
  if 限数.kind_of?(Array)
    if len < 3
      raise ArgumentError, "二次相乗之法: 限数長不正"
    end
  else
    raise TypeError, "二次相乗之法: 限数型不正"
  end
  if 定積.kind_of?(Array)
    if len != 定積.length
      raise ArgumentError, "二次相乗之法: 定積長不正"
    end
  else
    raise TypeError, "二次相乗之法: 定積型不正"
  end
 
  平積法 = Array.new
  for i in 1..(len - 1)
    平積法.push( 限数[i] - 限数[i-1] )
  end
  平積実 = Array.new
  for i in 1..(len - 1)
    平積実.push( 定積[i] - 定積[i-1] )
  end
  平積 = Array.new
  for i in 0..(平積法.length - 1)
    平積.push( 平積実[i] / 平積法[i] )
  end
 
  # 平積の恒等性判定
  flag = 1
  for i in 1..(平積.length - 1)
    if 平積[0] != 平積[i] then
      flag = 0
    end
  end
 
  # 数表出力
  p 限数; p 定積; p 平積法; p 平積実; p 平積
 
  # 平積が恒等である場合
  if flag > 0
    return [ 定積[0] - 平積[0] * 限数[0], 平積[0] ]
  end
 
  # 平積が恒等でない場合
  立積法 = Array.new
  for i in 2..(len - 1)
    立積法.push( 限数[i] - 限数[i-2] )
  end
  立積実 = Array.new
  for i in 1..(平積.length - 1)
    立積実.push( 平積[i] - 平積[i-1] )
  end
  立積 = Array.new
  for i in 0..(立積法.length - 1)
    立積.push( 立積実[i] / 立積法[i] )
  end
 
  # 立積の恒等性判定
  flag = 1
  if 立積.length > 1
    for i in 1..(立積.length - 1)
      if 立積[0] != 立積[i] then
        flag = 0
      end
    end
  end
 
  # 数表出力
  p 立積法; p 立積実; p 立積
 
  # 立積が恒等である場合
  if flag > 0
    y = Array.new
    for i in 0..(len - 1)
      y.push( 定積[i] - 立積[0] * 限数[i] * 限数[i] )
    end
    l = 一次相乗之法( 限数, y )
    l << 立積[0]
    return l
  else
    return 0
  end
 
end
 
p Poly1(
  二次相乗之法(
    [ 10, 20, 30, 40, 50 ],
    [ 48841000/10, 92576000/20, 131019000/30, 163984000/40, 191285000/50 ]
  )
)
p Poly1(
  二次相乗之法(
    [ 3, 8, 11 ],
    [ 14/3, 204/8, 506/11 ]
  )
)
 sampA02.rbの実行結果
[10, 20, 30, 40, 50]
[4884100, 4628800, 4367300, 4099600, 3825700]
[10, 10, 10, 10]
[-255300, -261500, -267700, -273900]
[-25530, -26150, -26770, -27390]
[20, 20, 20]
[-620, -620, -620]
[-31, -31, -31]
[10, 20, 30, 40, 50]
[4887200, 4641200, 4395200, 4149200, 3903200]
[10, 10, 10, 10]
[-246000, -246000, -246000, -246000]
[-24600, -24600, -24600, -24600]
-31X^2 - 24600X + 5133200
[3, 8, 11]
[(14/3), (51/2), 46]
[5, 3]
[(125/6), (41/2)]
[(25/6), (41/6)]
[8]
[(8/3)]
[(1/3)]
[3, 8, 11]
[(5/3), (25/6), (17/3)]
[5, 3]
[(5/2), (3/2)]
[(1/2), (1/2)]
1/3X^2 + 1/2X + 1/6
算譜A03 三次相乗之法 (sampA03.rb)
# coding: utf-8
require 'mathn'
require './poly1'
 
def 三次相乗之法( 限数, 定積 )
 
  len = 限数.length
 
  # 引数検査
  if 限数.kind_of?(Array)
    if len < 4
      raise ArgumentError, "三次相乗之法: 限数長不正"
    end
  else
    raise TypeError, "三次相乗之法: 限数型不正"
  end
  if 定積.kind_of?(Array)
    if len != 定積.length
      raise ArgumentError, "三次相乗之法: 定積長不正"
    end
  else
    raise TypeError, "三次相乗之法: 定積型不正"
  end
 
  平積法 = Array.new
  for i in 1..(len - 1)
    平積法.push( 限数[i] - 限数[i-1] )
  end
  平積実 = Array.new
  for i in 1..(len - 1)
    平積実.push( 定積[i] - 定積[i-1] )
  end
  平積 = Array.new
  for i in 0..(平積法.length - 1)
    平積.push( 平積実[i] / 平積法[i] )
  end
 
  # 平積の恒等性判定
  flag = 1
  for i in 1..(平積.length - 1)
    if 平積[0] != 平積[i] then
      flag = 0
    end
  end
 
  # 数表出力
  p 限数; p 定積; p 平積法; p 平積実; p 平積
 
  # 平積が恒等である場合
  if flag > 0
    return [ 定積[0] - 平積[0] * 限数[0], 平積[0] ]
  end
 
  # 平積が恒等でない場合
  立積法 = Array.new
  for i in 2..(len - 1)
    立積法.push( 限数[i] - 限数[i-2] )
  end
  立積実 = Array.new
  for i in 1..(平積.length - 1)
    立積実.push( 平積[i] - 平積[i-1] )
  end
  立積 = Array.new
  for i in 0..(立積法.length - 1)
    立積.push( 立積実[i] / 立積法[i] )
  end
 
  # 立積の恒等性判定
  flag = 1
  if 立積.length > 1
    for i in 1..(立積.length - 1)
      if 立積[0] != 立積[i] then
        flag = 0
      end
    end
  end
 
  # 数表出力
  p 立積法; p 立積実; p 立積
 
  # 立積が恒等である場合
  if flag > 0
    y = Array.new
    for i in 0..(len - 1)
      y.push( 定積[i] - 立積[0] * 限数[i] * 限数[i] )
    end
    l = 一次相乗之法( 限数, y )
    l << 立積[0]
    return l
  end
 
  # 立積が恒等でない場合
  三乗積法 = Array.new
  for i in 3..(len - 1)
    三乗積法.push( 限数[i] - 限数[i-3] )
  end
  三乗積実 = Array.new
  for i in 1..(立積.length - 1)
    三乗積実.push( 立積[i] - 立積[i-1] )
  end
  三乗積 = Array.new
  for i in 0..(三乗積法.length - 1)
    三乗積.push( 三乗積実[i] / 三乗積法[i] )
  end
 
  # 三乗積の恒等性判定
  flag = 1
  if 三乗積.length > 1
    for i in 1..(三乗積.length - 1)
      if 三乗積[0] != 三乗積[i] then
        flag = 0
      end
    end
  end
 
  # 数表出力
  p 三乗積法; p 三乗積実; p 三乗積
 
  # 三乗積が恒等である場合
  if flag > 0
    y = Array.new
    for i in 0..(len - 1)
      y.push( 定積[i] - 三乗積[0] * 限数[i] * 限数[i] * 限数[i] )
    end
    l = 二次相乗之法( 限数, y )
    l << 三乗積[0]
    return l
  end
 
end
 
p Poly1(
  三次相乗之法(
    [ 5, 11, 16, 18 ],
    [ 57100/5, 44374/11, 183424/16, 345024/18 ]
  )
)
 sampA03.rbの実行結果
[5, 11, 16, 18]
[11420, 4034, 11464, 19168]
[6, 5, 2]
[-7386, 7430, 7704]
[-1231, 1486, 3852]
[11, 7]
[2717, 2366]
[247, 338]
[13]
[91]
[7]
[5, 11, 16, 18]
[10545, -5283, -17208, -21656]
[6, 5, 2]
[-15828, -11925, -4448]
[-2638, -2385, -2224]
[11, 7]
[253, 161]
[23, 23]
[5, 11, 16, 18]
[9970, -8066, -23096, -29108]
[6, 5, 2]
[-18036, -15030, -6012]
[-3006, -3006, -3006]
7X^3 + 23X^2 - 3006X + 25000
Published by SANENSYA Co.,Ltd.