質問の線形代数の行列の問題をPythonで解いてみた。

 質問線形代数の行列の問題を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 ー 効率的なループ実行のためのイテレータ生成関数