質問の線形代数の行列の問題をPythonで解いてみました。(^_^;
回答者さんのCプログラムを参考にさせていただきました。はじめ、aの要素を一度に20個、用意しなければならないと思って、ちょっと無理かなと思っていましたが、一度に4個ずつで良かったんですね。(^_^;
それから、Javaみたいにラベル付きbreak / continueがあればいいのですが、多重ループの抜け方にちょっと苦労しました。(^_^;
● linAlgMat1.py
# coding: utf-8 # linAlgMat1.py def main(): import itertools from time import time tm=time() # Timer Start cnt = 0 b = [12,20,25,32,37] for x in itertools.product(range(1,41),repeat=4): if not(x[0]<=x[1]<=x[2]<=x[3]): continue ## s = "" for i in range(5): for a in itertools.product((-1,0,1),repeat=4): if a[0]*x[0]+a[1]*x[1]+a[2]*x[2]+a[3]*x[3]==b[i]: ## s += str(a)+"\n" break else: break else: i += 1 if i< 5: continue # チェックを潜り抜けたものだけを表示 cnt +=1 print("%5d : %s"%(cnt,x)) ## print(s) tm=time()-tm # Timer Stop print("Runtime : %.3f [sec]"%tm) if __name__ == '__main__': main()
●実行結果
1 : (1, 2, 9, 26) 2 : (1, 2, 9, 31) 3 : (1, 2, 11, 23) …(省略)… 6302 : (28, 32, 33, 40) 6303 : (28, 32, 35, 40) 6304 : (28, 32, 37, 40) Runtime : 16.645 [sec]
※参考URL
●10.1. itertools ー 効率的なループ実行のためのイテレータ生成関数