شمارش با لم برنساید و روش پولیا (گردنبندها)
تعداد گردنبندهای n مهرهای با k رنگ را میشمارد، وقتی چرخاندن (و برگرداندن) گردنبند آن را عوض نکند: میانگین تعداد رنگآمیزیهایی که هر تقارن ثابت نگه میدارد، و هر تقارن با c دور، k^c رنگآمیزی را ثابت نگه میدارد.
چند گردنبند n مهرهای با k رنگ وجود دارد؟ k^n رنگآمیزی هست، ولی رنگآمیزیهایی که با چرخاندن (یا برگرداندن) گردنبند به هم تبدیل میشوند یک گردنبندند. پس باید مدارهای گروه تقارنها را بشماریم.
- زمان:
O(n log n) - حافظه:
O(n) - گریمالدی، فصل ۱۶
گردنبند ۶ مهرهای با ۲ رنگ، فقط با چرخش: (۶۴ + ۲ + ۴ + ۸ + ۴ + ۲) ÷ ۶ = ۱۴.
from math import gcddef necklaces(n, k, flips):# Count the colourings of n beads in a ring with k colours, where turning (and, if flips = 1, flipping) the ring# does not make a new necklace. Burnside: the count is the average number of colourings each symmetry fixes.rows = [] # for the picture: symmetry, its number of cycles, the colourings it fixestotal = 0for r in range(n):c = gcd(r, n) # turning by r splits the beads into gcd(r, n) cyclesfixed = k ** ctotal = total + fixedrows.append(["turn " + str(r), c, fixed])group = nif flips == 1:for i in range(n):if n % 2 == 1:c = (n + 1) // 2 # an axis through one bead and the gap opposite itelif i % 2 == 0:c = n // 2 + 1 # an axis through two opposite beadselse:c = n // 2 # an axis through two opposite gapsfixed = k ** ctotal = total + fixedrows.append(["flip " + str(i), c, fixed])group = 2 * ncount = total // groupreturn count
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
Call stack
- necklaces()خط 4
توضیح
مسئله
چند گردنبند n مهرهای با k رنگ وجود دارد؟ k^n رنگآمیزی هست، ولی رنگآمیزیهایی که با چرخاندن (یا برگرداندن) گردنبند به هم تبدیل میشوند یک گردنبندند. پس باید مدارهای گروه تقارنها را بشماریم.
لم برنساید
تعداد مدارها برابر است با میانگین تعداد رنگآمیزیهایی که هر عضو گروه ثابت نگه میدارد:
تعداد گردنبندها = (1/|G|) Σ_g fix(g)
روش پولیا
یک تقارن مهرهها را به دورهایی تقسیم میکند؛ رنگآمیزی ثابت است اگر و تنها اگر روی هر دور یکرنگ باشد. پس تقارنی با c دور، k^c رنگآمیزی را ثابت نگه میدارد.
- چرخش به اندازهی
r:gcd(r, n)دور. - بازتاب: اگر
nفرد باشد(n + 1)/2دور؛ اگر زوج،n/2 + 1(محور از دو مهره) یاn/2(محور از دو فاصله).
ورودی
n تعداد مهرهها، k تعداد رنگها، و flips = 1 یعنی برگرداندن هم مجاز است (دستبند).