⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zmod.py

📁 minimal python variant for small footprint apps like embedded apps
💻 PY
字号:
# module 'zmod'# Compute properties of mathematical "fields" formed by taking# Z/n (the whole numbers modulo some whole number n) and an # irreducible polynomial (i.e., a polynomial with only complex zeros),# e.g., Z/5 and X**2 + 2.## The field is formed by taking all possible linear combinations of# a set of d base vectors (where d is the degree of the polynomial).## Note that this procedure doesn't yield a field for all combinations# of n and p: it may well be that some numbers have more than one# inverse and others have none.  This is what we check.## Remember that a field is a ring where each element has an inverse.# A ring has commutative addition and multiplication, a zero and a one:# 0*x = x*0 = 0, 0+x = x+0 = x, 1*x = x*1 = x.  Also, the distributive# property holds: a*(b+c) = a*b + b*c.# (XXX I forget if this is an axiom or follows from the rules.)import poly# Example N and polynomialN = 5P = poly.plus(poly.one(0, 2), poly.one(2, 1)) # 2 + x**2# Return x modulo y.  Returns >= 0 even if x < 0.def mod(x, y):	return divmod(x, y)[1]# Normalize a polynomial modulo n and modulo p.def norm(a, n, p):	a = poly.modulo(a, p)	a = a[:]	for i in range(len(a)): a[i] = mod(a[i], n)	a = poly.normalize(a)	return a# Make a list of all n^d elements of the proposed field.def make_all(mat):	all = []	for row in mat:		for a in row:			all.append(a)	return alldef make_elements(n, d):	if d == 0: return [poly.one(0, 0)]	sub = make_elements(n, d-1)	all = []	for a in sub:		for i in range(n):			all.append(poly.plus(a, poly.one(d-1, i)))	return alldef make_inv(all, n, p):	x = poly.one(1, 1)	inv = []	for a in all:		inv.append(norm(poly.times(a, x), n, p))	return invdef checkfield(n, p):	all = make_elements(n, len(p)-1)	inv = make_inv(all, n, p)	all1 = all[:]	inv1 = inv[:]	all1.sort()	inv1.sort()	if all1 == inv1: print 'BINGO!'	else:		print 'Sorry:', n, p		print all		print invdef rj(s, width):	if type(s) <> type(''): s = `s`	n = len(s)	if n >= width: return s	return ' '*(width - n) + sdef lj(s, width):	if type(s) <> type(''): s = `s`	n = len(s)	if n >= width: return s	return s + ' '*(width - n)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -