1. 程式人生 > 其它 >用零知識證明實現地圖的三染色問題

用零知識證明實現地圖的三染色問題

題目

題目:用零知識證明實現地圖的三染色問題(用三種顏色染色一個地圖,保證任意兩個相鄰的地區都是不同的顏色)。

程式設計驗證下述的設計思路,採用Python和C語言編寫均可。

條件:假設一個互動協議有證明者Alice和驗證者Bob。Alice手裡有一個地圖三染色的答案(請見下圖),這個圖總共有6個頂點和6條邊。現在Alice想證明給Bob她有答案,但是又不想讓Bob知道這個答案。請用零知識證明的思想設計實驗並驗證至少20次的結果。

測試資料:

1)邊集:(1, 2), (1, 4), (1, 3), (2, 5), (3, 6), (5, 6)

顏色集:(1: 0, 2: 1, 3: 2, 4: 1, 5: 2, 6: 0)

2)邊集:(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)

顏色集:(1: 0, 2: 1, 3: 2, 4: 1, 5: 2, 6: 0)

3)邊集:(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)

顏色集:(1: 0, 2: 1, 3: 1, 4: 2, 5: 2, 6: 0)

思路:

1)Alice 先要對染過色的圖進行一些變換,把顏色做一次全改,例如把所有的綠色變成橙色,把所有的黃色變成藍色,把所有的紅色變成粉色。然後 Alice 得到了一個新的染色答案,這時候她把新的圖的每一個頂點都用紙片蓋上,然後出示給 Bob 看。

2)Bob要隨機挑選一條邊,並由Alice揭開這條邊兩端的紙片,讓Bob檢查,Bob發現這兩個頂點的顏色是不同的,那麼Bob認為這次檢驗同構。

經過多次驗證,可以證明Bob認為這個圖滿足三染色的要求。

程式碼

import random
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

#初始化結點顏色
color0='red'
color1='yellow'
color2='green'
#構造空的無向圖
graph= nx.Graph()
#新增結點
node_list = [1,2,3,4,5,6]
for i in range(0,5):
graph.add_node(node_list[i])
#新增測試資料的邊與顏色
n = str(input('請選擇圖a,圖b,圖c'))
if n=='a':
edge_list=[(1, 2), (1, 4), (1, 3), (2, 5), (3, 6), (5, 6)]
colors=[color0,color1,color2,color1,color2,color0]
elif n=='b':
edge_list = [(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)]
colors=[color0,color1,color2,color1,color2,color0]
elif n=='c':
edge_list=[(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)]
colors=[color0, color1, color1, color2, color2, color0]
graph.add_edges_from(edge_list)
#畫原始圖形
nx.draw(graph, pos=nx.spring_layout(graph), with_labels=True, font_size=20, node_size=500, node_color=colors)
plt.show()
#隨機生成顏色函式
def randomcolor():
colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
color = ""
for i in range(6):
color += colorArr[random.randint(0,14)]
return "#"+color
#修改顏色
def changeColor():
color0=randomcolor()
color1=randomcolor()
color2=randomcolor()
if n == 'a':
colors = [color0, color1, color2, color1, color2, color0]
elif n == 'b':
colors = [color0, color1, color2, color1, color2, color0]
elif n == 'c':
colors = [color0, color1, color1, color2, color2, color0]
colorchange=colors
nx.draw(graph, pos=nx.spring_layout(graph), with_labels=True, font_size=20, node_size=500)
plt.show()
checknode1=int(input("請輸入檢視的第一個結點"))
print("顏色是",colors[checknode1+1])
checknode2=int(input("請輸入檢視的另一個結點"))
print("顏色是",colors[checknode2+1])
nx.draw(graph, pos=nx.spring_layout(graph), with_labels=True, font_size=20, node_size=500,node_color=colorchange)
plt.show()

for i in range(0,3):
changeColor()