地図の塗分け
REM 上の地図で隣り合う部分が異なる色になるように6色で塗り分ける方法の数。十進BASICSI使用。
FOR a=1 TO 6
FOR b=1 TO 6
FOR c=1 TO 6
FOR d=1 TO 6
FOR e=1 TO 6
IF a<>b AND a<>c AND b<>c AND b<>d AND b<>e AND c<>e AND d<>e THEN LET s=s+1
NEXT E
NEXT D
NEXT C
NEXT B
NEXT A
PRINT s
END
ライツアウトを解く
10進basicを使っています
DIM a(9,9)
DIM b(9,9)
DIM c(9)
DIM d(9)
MAT a=ZER
LET a(1,1)=1
LET a(1,2)=1
LET a(1,4)=1
LET a(2,1)=1
LET a(2,2)=1
LET a(2,3)=1
LET a(2,5)=1
LET a(3,2)=1
LET a(3,3)=1
LET a(3,6)=1
LET a(4,1)=1
LET a(4,4)=1
LET a(4,5)=1
LET a(4,7)=1
LET a(5,2)=1
LET a(5,4)=1
LET a(5,5)=1
LET a(5,6)=1
LET a(5,8)=1
LET a(6,3)=1
LET a(6,5)=1
LET a(6,6)=1
LET a(6,9)=1
LET a(7,4)=1
LET a(7,7)=1
LET a(7,8)=1
LET a(8,5)=1
LET a(8,7)=1
LET a(8,8)=1
LET a(8,9)=1
LET a(9,6)=1
LET a(9,8)=1
LET a(9,9)=1
MAT b=INV(a)
LET c(1)=1
LET c(2)=1
LET c(3)=0
LET c(4)=0
LET c(5)=0
LET c(6)=0
LET c(7)=1
LET c(8)=0
LET c(9)=0
MAT d=b*c
LET g=DET(a)
DIM h(9)
MAT h=g*d
FOR k=1 TO 9
PRINT MOD( h(k),2)
NEXT K
END
奇数次の魔方陣を10進BASICで作る
https://www.mirai-kougaku.jp/laboratory/pages/161118.php
REM 十進basicを使っています。オプションメニューから文法--microsoft BASIC互換を選んで実行してください。
REM !印以下は注釈文です。実行には影響を与えません。
REM アルゴリズムはサイモン-ド-ラ-ルベールの斜進法を使っています。斜進法についてはインターネットなどで調べてください。
REM -------------------------------------------------------------------
INPUT PROMPT "奇数を入力してください。":n
PRINT ! 出力を見やすくするため
PRINT !
PRINT !
OPTION BASE 1
DIM a(n,n) !用いる配列の宣言
MAT a=ZER !配列を0で初期化
LET k=1
LET i=1 ! 行上段
LET j=(n+1)/2 ! 列中央
LET a(i,j)=1 ! 上段中央を1とする
10
LET k=k+1
IF k=n*n+1 THEN GOTO 50 ! 全部置けたら50へ飛んで盤面を表示
LET i=i-1
LET j=j+1
IF i<1 AND j>n THEN LET a(i+2,j-1)=k:i=i+2:j=j-1:GOTO 10
IF i<1 THEN GOTO 30 ! iの値が上側の壁なら30へ飛ぶ
IF j>n THEN GOTO 40 ! jの値が右側の壁なら40へ飛ぶ
IF a(i,j)=0 THEN LET a(i,j)=k :GOTO 10 ! 進むべきところが0ならそこをkとする
IF a(i,j)<>0 THEN LET a(i+2,j-1)=k :i=i+2:j=j-1:GOTO 10 !進むべきところが0でないならば1つ下をkとする
30
LET i=n ! 下段に飛ぶ
LET j=j
LET a(i,j)=k
GOTO 10 ! 行番号10へもどる
40
LET i=i
LET j=1 ! 一番左の列に飛ぶ
LET a(i,j)=k
GOTO 10 ! 行番号10へもどる
REM ------------------------------------------------
! 盤面出力
50
PRINT n;"次魔方陣"
PRINT
FOR p=1 TO n
FOR q=1 TO n
PRINT a(p,q);
NEXT Q
PRINT
NEXT P
REM---------------------------------------------------------
PRINT
PRINT "各行の合計の確認"
sum=0
FOR t=1 TO n
FOR tt=1 TO n
sum=sum+a(t,tt)
NEXT
PRINT sum
sum=0
NEXT
REM ------------------------------------
PRINT
PRINT "各列の合計の確認"
sum2=0
FOR t=1 TO n
FOR tt=1 TO n
sum2=sum2+a(tt,t)
NEXT
PRINT sum2
sum2=0
NEXT
REM---------------------------------------------
PRINT
PRINT "主対角線の合計の確認"
sum3=0
FOR t=1 TO n
FOR tt=1 TO n
IF t=tt THEN sum3=sum3+a(t,tt)
NEXT
NEXT
PRINT sum3
REM------------------------------------
PRINT
PRINT "副対角線の合計の確認"
sum4=0
FOR t=1 TO n
FOR tt=1 TO n
IF t+tt=n+1 THEN sum4=sum4+a(t,tt)
NEXT
NEXT
PRINT sum4
END
10進basicで分割数を求める
mathematician.blog.jp行列式で分割数を求めています詳しくは上のサイトから
INPUT n
DIM a(200,200)
MAT a=ZER
DIM d(n,n)
FOR i=1 TO n
FOR j=1 TO n
FOR k=1 TO 30
IF i=j THEN LET a(i,j)=1
IF j=i+1 THEN LET a(i,j)=-1
IF i=j+(k*(3*k-1)/2-1) THEN LET a(i,j)=(-1)^(k+1)
IF i=j+(k*(3*k+1)/2-1) THEN LET a(i,j)=(-1)^(k+1)
NEXT K
NEXT J
NEXT I
REM -------------------------------------------
FOR b=1 TO n
FOR c=1 TO n
LET d(b,c)= a(b,c)
PRINT d(b,c);
NEXT C
PRINT
NEXT B
REM-----------------------------------
PRINT DET(d)
END
オリジナル ディオファントス方程式の解法
不定方程式 a^3+b^5=c^7を解いてください。
解答
*は乗算,^はべき乗を表します。
まずa=p^5, b=p^3, c=2*p^2 とおきます。
するとa^3+b^5=p^15+p^15=(2^7)*(p^14)=c^7
となります。まとめるとp^14*(p+p-2^7)=0となります。
よって2*p=2^7
ゆえにp=2^6となります。
a=p^5=(2^6)^5
=2^30,
b=p^3=(2^6)^3
=2^18,
c=2*p^2=2*(2^6)^2
=2^13と解がもとまりました。
間違いないか検算をしてみましょう。
左辺=a^3+b^5=(2^30)^3+(2^18)^5
=2^90+2^90=2^91
右辺=c^7=(2^13)^7=2^91
確かに左辺=右辺となっています。
最初にa=p^5, b=p^3, c=2*p^2
とおきましたが置き方を工夫することで
(係数をつけたりする)解はいくらでも得られます。
不定方程式だから当然ですけれど。
ただしa^4+b^6=c^8などは解けません。
この手の方程式が解をもつためには
方程式の指数がたがいに共通因数を
持っていてはならないのです。
冒頭で上げた例の指数はそれぞれ3,5,7でこれらは
共通因数を持たないので方程式はとけました。
解き方のコツはa,b,cをpの式で表し各項のpの指数が
1差になるようにすればよいのです。
上の解き方をよく見てください。
同様な考えでa^3+5*(b^5)=6*(c^7)とかも解けますし
項数が増えてa^3+b^5+c^7+d^6=e^12とかも解けます。
エラトステネスの篩
DIM a(1000)
FOR b=2 TO 1000
LET a(b)=b
NEXT B
REM------------------------------------
FOR i=2 TO 1000
FOR j=2 TO 1000
IF i<>a(j) AND MOD(a(j),i)=0 THEN LET a(j)=0
NEXT J
NEXT I
REM ------------------------------
LET t=1
FOR k=2 TO 1000
IF a(k)<>0 THEN PRINT t;"番目の素数" ;a(k)
IF a(k)<>0 THEN LET t=t+1
NEXT K
END