คุณสามารถใช้วิธีที่ได้รับสูตรการทำซ้ำด้านล่างเพื่อค้นหาการเข้ารหัสของคุณ:
Bn+1=∑k=0n(nk)Bk.
นี้จะได้รับการพิสูจน์โดยพิจารณาองค์ประกอบอื่น ๆ หลายวิธีที่จะอยู่ในส่วนที่มีองค์ประกอบn+11 หากมีn−kของสิ่งเหล่านี้เราก็มี(nn−k)=(nk)ตัวเลือกสำหรับพวกเขาและBkตัวเลือกสำหรับการแบ่งส่วนที่เหลือ
ใช้นี้เราสามารถให้ขั้นตอนวิธีการเวียนเกิดการแปลงพาร์ทิชันใด ๆn+1ไปยังหมายเลขในช่วง0,…,Bn+1−1 1 ฉันคิดว่าคุณมีวิธีในการแปลงชุดย่อยขนาดkของ{1,…,n}เป็นตัวเลขในช่วง0,…,(nk)−1(อัลกอริทึมดังกล่าวสามารถออกแบบในลักษณะเดียวกันโดยใช้การเกิดซ้ำของ Pascal(nk)=(n−1k)+(n−1k−1) )
สมมติว่าส่วนที่มีn+1มีองค์ประกอบอื่น ๆ อยู่kค้นหารหัสC1 1 คำนวณพาร์ติชันของ{1,…,n−k}โดย "การบีบอัด" องค์ประกอบที่เหลือทั้งหมดไปยังช่วงนั้น คำนวณรหัสC2ซ้ำ ๆ รหัสใหม่คือC=∑l=0n−k−1(nl)Bl+C1Bn−k+C2.
ในอีกทางหนึ่งให้รหัสCค้นหาค่าkเฉพาะที่
∑l=0n−k−1(nl)Bl≤C<∑l=0n−k(nl)Bl,
และกำหนด
C′=C−∑l=0n−k−1(nl)Bl.
ตั้งแต่0≤C′<(nk)Bn−kก็สามารถเขียนเป็นC1Bn−k+C2ที่0≤C2<Bn−kk ตอนนี้รหัสC1องค์ประกอบในส่วนที่มีn+1และรหัสC2พาร์ทิชันของ{1,…,n−k}ซึ่งสามารถถอดรหัสซ้ำได้ ให้เสร็จสมบูรณ์ถอดรหัส, คุณต้อง "ยกเลิกการบีบอัด" พาร์ทิชันหลังเพื่อที่จะมีทุกองค์ประกอบไม่ปรากฏในส่วนที่มีn+1 1
นี่คือวิธีการใช้เทคนิคเดียวกันในการเข้ารหัสชุดย่อยSของ{1,…,n}ของขนาดkซ้ำ ๆ ถ้าk=0แล้วรหัสเป็น0ดังนั้นสมมติว่าk>0 0 ถ้าn∈Sให้C1เป็นรหัสของS∖{n}เป็นเซตย่อยของขนาดk−1ของ{1,…,n−1}; รหัสของSคือC1 1 ถ้าn∉Sปล่อยให้C1เป็นรหัสของSเป็นเซตย่อยของขนาดkของ{1,…,n−1} ; รหัสของSคือC1+(n−1k−1) )
ในการถอดรหัสรหัสCมีสองกรณี ถ้าC<(n−1k−1)แล้วถอดรหัสชุดย่อยS′ของ{1,…,n−1}ขนาดk−1ที่มีรหัสคือCและเอาท์พุทS′∪{n}} มิฉะนั้นถอดรหัสชุดย่อยS′ของ{1,…,n−1}ของขนาดkซึ่งโค้ดคือC−(n−1k−1), and output S′.