Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#26 02. 12. 2011 18:22 — Editoval Andrejka3 (02. 12. 2011 19:09)

Andrejka3
Moderátor
Příspěvky: 1994
Škola: PŘF UP Olomouc (2015)
Reputace:   119 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑↑ Pavel Brožek:
Distributivita není třeba. V základní definici svazu není. Pak se ale sbírka věnuje i distributivím svazům. Tam jsem zatím nedošla.
Podpříklad: Buď $(L,\wedge,\vee)$ svaz a definujme relaci $\leq$ na $L$ podminkou:
$a \leq b \Leftrightarrow a \wedge b = a$.
Dokaž, že je $(L, \leq)$ svazově uspořádaná množina.

Řešení:
$(L, \leq)$ je uspořádaná množina:


Svazové uspořádání

Edit: To by melo byt vse.


What does a drowning number theorist say?
'log log log log ...'

Offline

 

#27 02. 12. 2011 18:24 — Editoval Andrejka3 (02. 12. 2011 19:02)

Andrejka3
Moderátor
Příspěvky: 1994
Škola: PŘF UP Olomouc (2015)
Reputace:   119 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑↑ radekm:
To je tedy kopa generátorů! Akorát nejspíš na nic nepřijdu, protože mi připadají ty svazy ekvivalencí chaotické a nevím už čeho se chytit.
PS: a 50 je takové hezké číslo. Začíná to zapadat. :D
Teď vážně. Velmi si cením Tvé snahy. Je to hezký výstup.


What does a drowning number theorist say?
'log log log log ...'

Offline

 

#28 02. 12. 2011 19:00

check_drummer
Příspěvky: 4623
Reputace:   99 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑↑ Pavel Brožek:
Já to bral jako definici - že tak je ta operace $\vee$ pro danou strukturu ekvivalencí definována... Možná je to ale důlsedek - a jinak to být ani nemůže...


"Máte úhel beta." "No to nemám."

Offline

 

#29 02. 12. 2011 20:52

radekm
Příspěvky: 146
Reputace:   11 
Web
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

Svaz ekvivalencí na 5 prvcích má 5305 čtyřprvkových generátorů (pokud to nemám špatně). Například tam jsou:

Code:

30|1|2||4  **  40|31|2||  **  0|21||43|  **  0|41|32||
20|1||3|4  **  30|21|||4  **  40|31|2||  **  0|41|2|3|
10||42|3|  **  30|1|2||4  **  40|321|||  **  0|41|2|3|
410||32||  **  320|41|||  **  420|1||3|  **  0|21||43|
3210||||4  **  420|1||3|  **  30|41|2||  **  0|21||43|

Offline

 

#30 02. 12. 2011 20:57

radekm
Příspěvky: 146
Reputace:   11 
Web
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

Vypadá to, že hledané řešení má László Zádori v článku Generation of finite partition lattices (Theorem 2 - první část).

První to asi dokázal H. Strietz v článku Finite partition lattices are four-generated, ale bohužel se mi článek nepodařilo najít.

Offline

 

#31 02. 12. 2011 21:06 — Editoval radekm (03. 12. 2011 08:55)

radekm
Příspěvky: 146
Reputace:   11 
Web
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

Přikládám kód v jazyce F#, s nímž jsem hledal generátory:

Code:

open System

// Rozklad reprezentovany kybliky je mapa, ktera mapuje cislo kybliku na obsah kybliku.
// Pro neprazdne kybliky plati, ze nejmensi cislo v kybliku je rovno cislu kybliku
// a cisla v kyblicich jsou serazena od nejvetsiho po nejmensi.
type RozkladKyb = Map<int, list<int>>

let generujRozklady n =
    let rec umistiPrvek (skoroRozklady : ResizeArray<RozkladKyb>) i =
        if i < n then
            let skoroRozklady' = ResizeArray<RozkladKyb>()

            // Do kazdeho skoro rozkladu umistime i-ty prvek do kazde prihradky
            for rozklad in skoroRozklady do
                for kyblik = 0 to n-1 do
                    // Filtr symetrii
                    if not rozklad.[kyblik].IsEmpty || kyblik = i then
                        skoroRozklady'.Add(rozklad.Add(kyblik, i :: rozklad.[kyblik]))

            umistiPrvek skoroRozklady' (i+1)
        else
            skoroRozklady

    let skoroRozklady = ResizeArray<RozkladKyb>()
    skoroRozklady.Add([0..n-1] |> List.map (fun i -> i, []) |> Map.ofList)

    umistiPrvek skoroRozklady 0

// Rozklad reprezentovany jako mnozina dvojic.
type Rozklad = Set<int * int>

// Prevede rozklad na mnozinu dvojic.
let rozkladKybNaMnozinuDvojic (rozklad : RozkladKyb) : Rozklad =
    let kyblikNaMnozinu (obsahKybliku : list<int>) =
        seq { for a in obsahKybliku do
                  for b in obsahKybliku do
                      yield (a, b)
            } |> Set.ofSeq

    rozklad
    |> Map.toSeq
    |> Seq.map snd
    |> Seq.map kyblikNaMnozinu
    |> Seq.concat
    |> Set.ofSeq

let mnozinaDvojicNaRozkladKyb n (rozklad : Rozklad) : RozkladKyb =
    let rec umistiPrvek (umisteniZatim : RozkladKyb) i =
        if i < n then
            let kybl =
                rozklad
                |> Seq.filter (fun (x, _) -> x = i)
                |> Seq.map snd
                |> Seq.min
            let umisteniZatim' = umisteniZatim.Add(kybl, i :: umisteniZatim.[kybl])
            umistiPrvek umisteniZatim' (i+1)
        else
            umisteniZatim

    let prazdneUmisteni = [0..n-1] |> List.map (fun i -> i, []) |> Map.ofList
    umistiPrvek prazdneUmisteni 0


let sjednoceni (vsechnyRozklady : seq<Rozklad>) (a : Rozklad) (b : Rozklad) =
    let c = Set.union a b
    let rozkladyObsahujiciC = vsechnyRozklady |> Seq.filter (Set.isSubset c)
    rozkladyObsahujiciC |> Seq.reduce Set.intersect

let prunik = Set.intersect

// Spusti danou operaci na vsech rozkladech (vysledky musi byt take rozklady)
// a ulozi vysledky do mapy
//
// Indexy rozkladu jsou urceny polem vsechnyRozkladyArr. Je treba pracovat s indexy,
// jinak je program strasne pomaly.
let vysledkyOperace (vsechnyRozkladyArr : Rozklad[]) (operace : Rozklad -> Rozklad -> Rozklad) =
    let arr = vsechnyRozkladyArr
    let indexy = [0..arr.Length-1]
    let vysledky = Array2D.create arr.Length arr.Length 0

    for i in indexy do
        for j in indexy do
            let rozklad = operace arr.[i] arr.[j]
            let index = Array.findIndex (fun r -> r = rozklad) arr
            vysledky.[i, j] <- index

    vysledky

let uzaverNaIndexech
        mnozinaKUzavreni
        (vysledkySjednoceni : int[,])
        (vysledkyPruniku : int[,])
        (vsechnyRozklady : Rozklad[]) =
    let rec krok mnoz naposledyPridano =
        let pridat = ref Set.empty

        // Vyuzivame komutativity a idempotence obou operaci
        for a in mnoz do
            for b in naposledyPridano do

                let sjed = vysledkySjednoceni.[a, b]
                if not (Set.contains sjed mnoz) then
                  pridat := pridat.Value.Add(sjed)

                let prun = vysledkyPruniku.[a, b]
                if not (Set.contains prun mnoz) then
                  pridat := pridat.Value.Add(prun)

        if pridat.Value.IsEmpty then
            mnoz
        else
            let mnoz' = Set.union mnoz !pridat
            krok mnoz' !pridat

    krok mnozinaKUzavreni mnozinaKUzavreni

// Vsechny k-tice z mnoziny
let kombinace mnozina k =
    let rec komb acc zbyva mnoz =
        seq { match zbyva, mnoz with
              | n, x::xs ->
                  if n > 0 then yield! komb (x::acc) (n-1) xs
                  if n >= 0 then yield! komb acc n xs
              | 0, [] -> yield acc
              | _, [] -> ()
            }

    komb [] k mnozina

// Hleda generatory svazu rozkladu - prvni parametr je velikost rozkladane mnoziny,
// druhy parametr je pocet generatoru.
let najdiGeneratoryNaIndexech velikostMnoziny pocetGeneratoru =
    let vsechnyRozkladyArr =
        generujRozklady velikostMnoziny
        |> Seq.map rozkladKybNaMnozinuDvojic
        |> Seq.toArray
    let vsechnyRozklady = Set.ofArray vsechnyRozkladyArr

    // Predpocitame vysledky sjednoceni a pruniku
    let vysledkySjednoceni = vysledkyOperace vsechnyRozkladyArr (sjednoceni vsechnyRozkladyArr)
    let vysledkyPruniku = vysledkyOperace vsechnyRozkladyArr prunik

    let indexyGeneratoru = kombinace [0..vsechnyRozkladyArr.Length-1] pocetGeneratoru

    seq { for gen in indexyGeneratoru do

          let genRozklady = uzaverNaIndexech (Set.ofList gen) vysledkySjednoceni vysledkyPruniku vsechnyRozkladyArr

          if genRozklady.Count = vsechnyRozklady.Count then
              let vybraneRozklady =
                  gen
                  |> Seq.map (fun i -> vsechnyRozkladyArr.[i])
                  |> Set.ofSeq

              yield
                vybraneRozklady
                |> Set.toList
                |> List.map (mnozinaDvojicNaRozkladKyb velikostMnoziny)
        }

// Prevod rozkladu do citelneho retezce
let rozkladKybNaRetezec (rozklad : RozkladKyb) =
    let kyblikNaRetezec (obsah : seq<int>) = String.Join("", obsah)

    rozklad
    |> Map.toSeq
    |> Seq.map (snd >> kyblikNaRetezec)
    |> String.concat "|"

// Prevede sadu rozkladu do citelneho retezce - vhodne pro tisk generatoru
let sadaGeneratoruNaRetezec (sada : list<RozkladKyb>) =
    sada
    |> List.map rozkladKybNaRetezec
    |> String.concat "  **  "

let casovac = System.Diagnostics.Stopwatch()
casovac.Start()

let pocetSad = ref 0

// VSTUPNI PARAMETRY SE ZADAVAJI NASLEDOVNE
// najdiGeneratoryNaIndexech pocetPrvkuVMnozine velikostGeneratoru,
//
// Volani "najdiGeneratoryNaIndexech 5 4" hleda ctverice generatoru svazu rozkladu
// mnoziny s peti prvky
for sadaGeneratoru in najdiGeneratoryNaIndexech 5 4 do
    pocetSad := !pocetSad + 1
    sadaGeneratoru |> sadaGeneratoruNaRetezec |> printfn "%s"

casovac.Stop();
printfn "pocet sad generatoru %d" !pocetSad
printfn "milisekund: %d" casovac.ElapsedMilliseconds

Edit: Úprava kódu

Offline

 

#32 02. 12. 2011 21:12

Andrejka3
Moderátor
Příspěvky: 1994
Škola: PŘF UP Olomouc (2015)
Reputace:   119 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑ radekm:
No řeknu vám, je radost s Vámi na tomto fóru být. Letmo jsem přehlédla ten článek a snad to pochopím za nějaký čas. Na začátku těm kongruencím moc nerozumím...
Až (a pokud vůbec) to pochopím, zkusím napsat nějaké shrnutí jestli to bude možné.
Kdyby to někdo pochopil a dokázal popsat, budu samozřejmě ráda.
Tak zatím a díky všem!


What does a drowning number theorist say?
'log log log log ...'

Offline

 

#33 02. 12. 2011 21:17

Pavel Brožek
Místo: Praha
Příspěvky: 5694
Škola: Informatika na MFF UK
Pozice: Student
Reputace:   194 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑ Andrejka3:

Díky.

↑ radekm:

Nevíš prosím, co znamená

generating set is of the form 1+1+1+1 or 1+1+2

?

Asi to ale vzdám, je to moc matematiky, kterou neznám.

Offline

 

#34 02. 12. 2011 21:24

radekm
Příspěvky: 146
Reputace:   11 
Web
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

↑ Pavel Brožek:

Je to vysvětlené na straně 580 dole: 1+1+1+1 znamená čtyři navzájem neporovnatelné prvky a 1+1+2 znamená, že tam jsou jen dva porovnatelné.

Offline

 

#35 02. 12. 2011 21:29 — Editoval check_drummer (02. 12. 2011 21:30)

check_drummer
Příspěvky: 4623
Reputace:   99 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

Pavel Brožek napsal(a):

... je to moc matematiky, kterou neznám.

Prof. Nešetřil používá v této souvislosti termín "neprůstřelný text". :-) I když to myslí tak, že i se znalostmi dané oblasti se i tak těžko postupuje kupředu.


"Máte úhel beta." "No to nemám."

Offline

 

#36 02. 12. 2011 21:50

Andrejka3
Moderátor
Příspěvky: 1994
Škola: PŘF UP Olomouc (2015)
Reputace:   119 
 

Re: Nejmenší generátor svazu ekvivalencí konečné množiny

Tak já to teda označuji za vyřešené. Jak jsem slíbila - pokud se prokoušu tou matikou, zkusím to shrnout.


What does a drowning number theorist say?
'log log log log ...'

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson