昨日の記事があまりにもヘヴィーだったので、そこでちょっとだけ触れたチェビシェフの多項式を、Excelを使ってどこまで求まるのかをやってみようかなと思います。
使うのはExcelのワークシートで、ワークシート関数でやっていきます。
さて、どうなることやら。
とりあえず見栄えも考えてブログ貼り付け用です。
htmlタグが入りますので、その辺も理解してくださいな。
1行目は、項のxのべき乗部分を作ります。
B1セルは空白のまま
定数項なので、これでokです。
C1セルに、
x
xの指数部分は1だが、1は省略されるから、これでokです。
D1セルに、
="x<sup>"&(COLUMN()-2)&"</sup>"
D1セルをコピーして、D1セルからAQ1セルまで横方向に伸ばしてペースト
xの指数部分をCOLUMN()-2で求めてます。
これで項に使うxのべき乗の文字列が完成
x41、41次まで作る気でいます。
続いて、チェビシェフの多項式の左辺にくる文字列を作ります。
A2セルに、
="T<sub>"&(ROW()-2)&"</sub>(x)="
A2セルをコピーして、A2セルからA43セルまで縦方向に伸ばしてペースト
これで左辺の「Tn(x)=」の部分が完成
n=41まで作る気でいます。
続いて、係数部分を作ります。
チェビシェフの多項式は、漸化式で2個前までのデータを利用するので、2行分は手入力です。
B2セル、C3セルを1
B3セル、C2セルを0
D2セル、D3セルを0
D2からD3セルをコピーし、D2セルからAQ2セルまで横方向に伸ばしてペースト
これで、T0(x)とT1(x)の係数データが出来ました。
今度は、定数項、B列を完成させます。
B4セルに、
=-B2
B4セルをコピーして、B4セルからB43セルまで縦方向に伸ばしてペースト
定数項は2行上のセルを-1倍するということですね。
続いて、xnの項、C列からAQ列までを一気に完成させます。
C4セルに、
=B3*2-C2
C4セルをコピーして、C4からAQ43セルまで斜め下に伸ばしてペースト
定数項以外は、左斜上のセルの値を2倍して、2行上のセルを-1倍して加えるということ。
つまり、1列右に行くのでxの次数が1増えるということですね。
これですべての係数データが揃いました。
続いて、係数データとxのべき乗とを組み合わせて、、正のものに符号を付けます。
AR列からCG列まで使います。
AR2セルに、
=IF(B2<>0,IF(B2>0,"+"&B2,B2),"")
AS2セルに、
=IF(C2>0,IF(C2=1,"+"&C$1,"+"&C2&C$1),IF(C2<0,C2&C$1,""))
AS2セルをコピーして、AS2セルからCG2セルまで横方向に伸ばしてペースト
AR2セルからCG2セルまでをコピーして、AR2セルからAR43セルまで縦方向に伸ばしてペースト
最後、CH列にブログへのコピー用データを作ります。
CH2セルに、
=A2&CG2&CF2&CE2&CD2&CC2&CB2&CA2&BZ2&BY2&BX2&BW2&BV2&BU2&BT2&BS2&BR2&BQ2&BP2&BO2&BN2&BM2&BL2&BK2&BJ2&BI2&BH2&BG2&BF2&BE2&BD2&BC2&BB2&BA2&AZ2&AY2&AX2&AW2&AV2&AU2&AT2&AS2&AR2&"<br>"
CH2セルをコピーして、CH2からCH43まで縦方向に伸ばしてペースト
出来上がったCH列をコピペしたのがこれだ!
T1(x)=+x
T2(x)=+2x2-1
T3(x)=+4x3-3x
T4(x)=+8x4-8x2+1
T5(x)=+16x5-20x3+5x
T6(x)=+32x6-48x4+18x2-1
T7(x)=+64x7-112x5+56x3-7x
T8(x)=+128x8-256x6+160x4-32x2+1
T9(x)=+256x9-576x7+432x5-120x3+9x
T10(x)=+512x10-1280x8+1120x6-400x4+50x2-1
T11(x)=+1024x11-2816x9+2816x7-1232x5+220x3-11x
T12(x)=+2048x12-6144x10+6912x8-3584x6+840x4-72x2+1
T13(x)=+4096x13-13312x11+16640x9-9984x7+2912x5-364x3+13x
T14(x)=+8192x14-28672x12+39424x10-26880x8+9408x6-1568x4+98x2-1
T15(x)=+16384x15-61440x13+92160x11-70400x9+28800x7-6048x5+560x3-15x
T16(x)=+32768x16-131072x14+212992x12-180224x10+84480x8-21504x6+2688x4-128x2+1
T17(x)=+65536x17-278528x15+487424x13-452608x11+239360x9-71808x7+11424x5-816x3+17x
T18(x)=+131072x18-589824x16+1105920x14-1118208x12+658944x10-228096x8+44352x6-4320x4+162x2-1
T19(x)=+262144x19-1245184x17+2490368x15-2723840x13+1770496x11-695552x9+160512x7-20064x5+1140x3-19x
T20(x)=+524288x20-2621440x18+5570560x16-6553600x14+4659200x12-2050048x10+549120x8-84480x6+6600x4-200x2+1
T21(x)=+1048576x21-5505024x19+12386304x17-15597568x15+12042240x13-5870592x11+1793792x9-329472x7+33264x5-1540x3+21x
T22(x)=+2097152x22-11534336x20+27394048x18-36765696x16+30638080x14-16400384x12+5637632x10-1208064x8+151008x6-9680x4+242x2-1
T23(x)=+4194304x23-24117248x21+60293120x19-85917696x17+76873728x15-44843008x13+17145856x11-4209920x9+631488x7-52624x5+2024x3-23x
T24(x)=+8388608x24-50331648x22+132120576x20-199229440x18+190513152x16-120324096x14+50692096x12-14057472x10+2471040x8-256256x6+13728x4-288x2+1
T25(x)=+16777216x25-104857600x23+288358400x21-458752000x19+466944000x17-317521920x15+146227200x13-45260800x11+9152000x9-1144000x7+80080x5-2600x3+25x
T26(x)=+33554432x26-218103808x24+627048448x22-1049624576x20+1133117440x18-825556992x16+412778496x14-141213696x12+32361472x10-4759040x8+416416x6-18928x4+338x2-1
T27(x)=+67108864x27-452984832x25+1358954496x23-2387607552x21+2724986880x19-2118057984x17+1143078912x15-428654592x13+109983744x11-18670080x9+1976832x7-117936x5+3276x3-27x
T28(x)=+134217728x28-939524096x26+2936012800x24-5402263552x22+6499598336x20-5369233408x18+3111714816x16-1270087680x14+361181184x12-69701632x10+8712704x8-652288x6+25480x4-392x2+1
T29(x)=+268435456x29-1946157056x27+6325010432x25-12163481600x23+15386804224x21-13463453696x19+8341487616x17-3683254272x15+1151016960x13-249387008x11+36095488x9-3281408x7+168896x5-4060x3+29x
T30(x)=+536870912x30-4026531840x28+13589544960x26-27262976000x24+36175872000x22-33426505728x20+22052208640x18-10478223360x16+3572121600x14-859955200x12+141892608x10-15275520x8+990080x6-33600x4+450x2-1
T31(x)=+1073741824x31-8321499136x29+29125246976x27-60850962432x25+84515225600x23-82239815680x21+57567870976x19-29297934336x17+10827497472x15-2870927360x13+533172224x11-66646528x9+5261568x7-236096x5+4960x3-31x
T32(x)=+2147483648x32-17179869184x30+62277025792x28-135291469824x26+196293427200x24-200655503360x22+148562247680x20-80648077312x18+32133218304x16-9313976320x14+1926299648x12-275185664x10+25798656x8-1462272x6+43520x4-512x2+1
T33(x)=+4294967296x33-35433480192x31+132875550720x29-299708186624x27+453437816832x25-485826232320x23+379364311040x21-218864025600x19+93564370944x17-29455450112x15+6723526656x13-1083543552x11+118243840x9-8186112x7+323136x5-5984x3+33x
T34(x)=+8589934592x34-73014444032x32+282930970624x30-661693399040x28+1042167103488x26-1167945891840x24+959384125440x22-586290298880x20+267776819200x18-91044118528x16+22761029632x14-4093386752x12+511673344x10-42170880x8+2108544x6-55488x4+578x2-1
T35(x)=+17179869184x35-150323855360x33+601295421440x31-1456262348800x29+2384042393600x27-2789329600512x25+2404594483200x23-1551944908800x21+754417664000x19-275652608000x17+74977509376x15-14910300160x13+2106890240x11-202585600x9+12403200x7-434112x5+7140x3-35x
T36(x)=+34359738368x36-309237645312x34+1275605286912x32-3195455668224x30+5429778186240x28-6620826304512x26+5977134858240x24-4063273943040x22+2095125626880x20-819082035200x18+240999137280x16-52581629952x14+8307167232x12-916844544x10+66977280x8-2976768x6+69768x4-648x2+1
T37(x)=+68719476736x37-635655159808x35+2701534429184x33-6992206757888x31+12315818721280x29-15625695002624x27+14743599316992x25-10531142369280x23+5742196162560x21-2392581734400x19+757650882560x17-180140769280x15+31524634624x13-3940579328x11+336540160x9-18356736x7+573648x5-8436x3+37x
T38(x)=+137438953472x38-1305670057984x36+5712306503680x34-15260018802688x32+27827093110784x30-36681168191488x28+36108024938496x26-27039419596800x24+15547666268160x22-6880289095680x20+2334383800320x18-601280675840x16+115630899200x14-16188325888x12+1589924864x10-103690752x8+4124064x6-86640x4+722x2-1
T39(x)=+274877906944x39-2680059592704x37+12060268167168x35-33221572034560x33+62646392979456x31-85678155104256x29+87841744879616x27-68822438510592x25+41626474905600x23-19502774353920x21+7061349335040x19-1960212234240x17+411402567680x15-63901286400x13+7120429056x11-543921664x9+26604864x7-746928x5+9880x3-39x
T40(x)=+549755813888x40-5497558138880x38+25426206392320x36-72155450572800x34+140552804761600x32-199183403319296x30+212364657950720x28-173752901959680x26+110292369408000x24-54553214976000x22+21002987765760x20-6254808268800x18+1424085811200x16-243433472000x14+30429184000x12-2677768192x10+156900480x8-5617920x6+106400x4-800x2+1
T41(x)=+1099511627776x41-11269994184704x39+53532472377344x37-156371169312768x35+314327181557760x33-461013199618048x31+510407471005696x29-435347548798976x27+289407177326592x25-150732904857600x23+61508749885440x21-19570965872640x19+4808383856640x17-898269511680x15+124759654400x13-12475965440x11+857722624x9-37840704x7+959728x5-11480x3+41x
これ合ってるんかな?
検証用にC言語で同じ結果が出るようなプログラムを書いてみるが、どうやら合ってそうだな。
Excelにおいて、数値がセルの幅に合わせて指数表記されるのだが、xxxE+14までは正しい値を保っているようです。
10の14乗、つまり10進数15桁までということ。
C言語では64ビット整数を使ってやったんだけど、それでもT52(x)が限界っぽいな。
係数に正も負もあるから、オーバーフロー検出は、2倍するところと、-1倍したものを加えるところで行う。
もしくは、係数の符号が交互に変わるという特性から、前後の項との符号が同じならオーバーフローしていると判断しても良さそうな気がする。
もしくは、係数の和が1になる性質でもよさそうだな。
Excelでは、これが一番簡単ですね。
CI2セルに、
=SUM(B2:AQ2)
CI2セルをコピーして、CI2セルからCI43セルまで下方向に伸ばしてペースト
全部1になっているはずである。
もし、なっていなかったら、どこかでミスをしています。
今回はExcelだけに留めて、C言語でのプログラミングは翌日にしましょう。
ヘヴィーな記事を書くのはキツイし、ライトな記事でこまめに小出ししていきます。
ではでは