世界のナベアツにBASICで挑戦! おもろ~

 投稿者:山中和義  投稿日:2008年10月29日(水)11時14分24秒
  以前、プログラミングの練習に「3の倍数」と「3の付く数」の判定方法を検討してみました。
今回は、数を多項式やベクトルや行列で表現して、その演算で判定してみます。


!自然数nの各位の値が係数となる多項式p(x)=k1+k2*x+k3*x^2+ …で表す。
!21の場合
! p(x)=1+2*x+0*x^2+0*x^3+ …
!元のnに戻すには、x=10として関数値を計算すればよい。
! p(10)=1*1+2*10+0*100+0*1000+ … =21

DEF p(x)=k1+k2*x+k3*x^2+k4*x^3 !多項式

FOR k2=0 TO 9 !十の位
   FOR k1=0 TO 9 !一の位

      IF MOD(p(1),3)=0 THEN !各桁の和が3の倍数なら
         PRINT p(10) !x=k1+k2*10+k3*100+ …
      ELSEIF k1=3 OR k2=3 THEN !いずれかが3となる
         PRINT p(10) !x=k1+k2*10+k3*100+ …
      END IF

   NEXT k1
NEXT k2





!自然数nの各位の値が成分となるベクトルで表す。
!21の場合
! (1 2)
!元のnに戻すには、10のべき乗を成分とするベクトルと内積をとればよい。
! (1 2)・(1 10)=1*1+2*10=21

LET K=4 !桁数

DIM CC(K) !定数 (1 1 1 …)
MAT CC=CON
DIM BB(K) !定数 (1 10 100 …)
FOR i=1 TO K
   LET BB(i)=10^(i-1) !位
NEXT i
DIM V(K) !ベクトル
FOR k2=0 TO 9 !十の位
   LET V(2)=k2
   FOR k1=0 TO 9 !一の位
      LET V(1)=k1

      IF MOD(DOT(V,CC),3)=0 THEN !各桁の和が3の倍数なら
         PRINT DOT(V,BB) !x=k1+k2*10+k3*100+ …
      ELSEIF V(1)=3 OR V(2)=3 THEN !いずれかが3となる
         PRINT DOT(V,BB) !x=k1+k2*10+k3*100+ …
      END IF

   NEXT k1
NEXT k2





!自然数nの各位の値が要素となる対角行列で表す。
!21の場合
! ┌ 1 0 ┐
! └ 0 2 ┘
!元のnに戻すには、10のべき乗を要素とする行列をかければよい。
! ┌ 1 0 ┐┌ 1 ┐
! └ 0 2 ┘└ 10 ┘
! =┌ 1 ┐
!  └ 20 ┘
!さらに、すべての要素が1の行列をかければよい。
! [1 1]┌ 1 ┐=[21]
!    └ 20 ┘

FUNCTION tr(A(,)) !行列Aのトレース
   LET t=0 !対角成分の和
   FOR m=1 TO MIN(UBOUND(A,1),UBOUND(A,2))
      LET t=t+A(m,m)
   NEXT m
   LET tr=t
END FUNCTION


LET K=4 !桁数

DIM B(K,1) !定数 t[1 10 100 …]
FOR i=1 TO K
   LET B(i,1)=10^(i-1) !位
NEXT i

DIM C(1,K) !定数 [1 1 1 …]
MAT C=CON

DIM TT(K,1),X(1,1) !作業用

DIM A(K,K) !対角行列
MAT A=ZER
FOR k2=0 TO 9 !十の位
   LET A(2,2)=k2
   FOR k1=0 TO 9 !一の位
      LET A(1,1)=k1

      IF MOD(tr(A),3)=0 THEN !各桁の和が3の倍数なら
         MAT TT=A*B !x=k1+k2*10+k3*100+ …
         MAT X=C*TT
         MAT PRINT X; !PRINT X(1,1)
      ELSEIF A(1,1)=3 OR A(2,2)=3 THEN !いずれかが3となる
         MAT TT=A*B !x=k1+k2*10+k3*100+ …
         MAT X=C*TT
         MAT PRINT X;
      END IF

   NEXT k1
NEXT k2


END
 

戻る