IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 《区块链编程》-第一章 -> 正文阅读

[区块链]《区块链编程》-第一章

《区块链编程》

使用Python构建有限域

Python的模运算

p16

书中代码复现 ,。p13

代码复现

# -*- coding: utf-8 -*-
# @Author: 从化北(喵星人)
# @Date:   2021-11-26 22:15:25
# @Last Modified by:   从化北
# @Last Modified time: 2021-11-26 22:29:58

class FieldElement:
	def __init__(self, num, prime):
		# 有限域内值范围[0,prime -1]
		if num >= prime or num < 0:
			error = 'Num {} not in field range 0 to {}'.format(
				num, prime - 1)
			raise ValueError(error)
		self.num = num 
		self.prime = prime

	def __repr__(self):
		# 文本格式化
		return 'FieldElement_{}({})'.format(self.prime, self.num)
	def __eq__(self, other):
		# 重写== 符号
		if other is None:
			return False
		return self.num == other.num  and self.prime == other.prime

测试

p13测试结果

练习1

p14
问题: 为FieldElement增加__ne__方法…
lzg:哭了,看到参考答案的那一刻,我感觉自己好菜呀。(是不理解问题本质的原因吗?)

自己写的

	def __ne__(self, other):
		# 重写 no equal 
		if other is None:
			return False
		print("this is ne ")
		return self.num != other.num or self.prime != other.prime

参考答案

	def __ne__(self, other):
		# this should be the inverse of the == operator
		# 调用了__eq__()
		return not (self == other)

测试

test1 结果

代码复现

python 模运算代码复现

练习2

p18

代码复现

p18 代码复现

练习3

p19

代码实现

	def __sub__(self, other):
		if self.prime != other.prime :
			raise TypeError("Can't sub two numbers in diffrent Fields")
		num = (self.num - other.num) % self.prime
		return self.__class__(num, self.prime)

练习4

p20

代码实现

print((97 * 45 * 31) % 97)
print((17 * 13 * 19 * 44) % 97)
print((12**7 * 77**49) % 97)

运行结果

0
68
63
[Finished in 260ms]

练习5

p20

代码实现

prime = 19
k = [1, 7, 13, 18]
for x in k:
    pass
    print([x * y % prime for y in range(prime)])
print("this is sorted result:")
for x in k:
    print(sorted([x * y % prime for y in range(prime)]))

运行结果

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[0, 7, 14, 2, 9, 16, 4, 11, 18, 6, 13, 1, 8, 15, 3, 10, 17, 5, 12]
[0, 13, 7, 1, 14, 8, 2, 15, 9, 3, 16, 10, 4, 17, 11, 5, 18, 12, 6]
[0, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
this is sorted result:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
[Finished in 247ms]

练习6

p20

代码实现

    def __mul__(self, other):
        if self.prime != other.prime:
            raise TypeError('Cannot mul two numbers in diffrent Fields')
        num = (self.num * other.num) % self.prime
        return self.__class__(num, self.prime)

运行结果

    # a = FieldElement(24, 31)
    # b = FieldElement(19, 31)
    # print(a * b == FieldElement(22, 31))
    True
[Finished in 299ms]

练习7

p21

代码实现

    list_prime = [7, 11, 17, 31]
    for prime in list_prime:
        for x in range(1, prime):
            # print(x, prime - 1, prime)
            print(pow(x, prime - 1, prime), end="  ")

运行结果

1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  
1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1  1  1  [Finished in 298ms]

练习8

p23

代码实现

    prime = 31
    print(3 * pow(24, prime - 2, prime) % prime)
    print(pow(17, prime - 4, prime))
    print(11 * (pow(4, prime - 5, prime)) % prime)

运行结果

4
29
13
[Finished in 485ms]

练习9

p23
这部分要修改__pow__()函数,使其能处理负数次幂
原理是费马小定理,具体解释在书上p24

代码实现

    def __pow__(self, exponent):
        n = exponent
        while n < 0:
            n += self.prime - 1
        num = pow(self.num, n, self.prime)
        return self.__class__(num, self.prime)

    def __truediv__(self, other):
        if self.prime != other.prime:
            raise TypeError('Cannot mul two numbers in diffrent Fields')
        num = (self.num * pow(other.num, self.prime - 2, self.prime)) % self.prime
        return self.__class__(num, self.prime)


模运算的计算公式
保留–等待写
三种取值方式
Java/C++ 与Python选择取值方式的不同

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:51:58  更:2021-12-08 13:52:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:31:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码