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

#1 03. 05. 2008 15:27

Lares
Zelenáč
Příspěvky: 3
Reputace:   
 

Polynomiální algoritmus řešící konečnost jazyka

Zdravím,

potřeboval bych poradit, jak začít s referátem:


Ukažte, že existuje polynomiální algorimus řešící následující problém:

VSTUP:
Deterministický konečný automat A

OTÁZKA:
Je jazyk L(A) nekonečný?

Offline

 

#2 03. 05. 2008 19:19 — Editoval Kondr (23. 05. 2008 00:50)

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Jazyk je nekonečný, právě když obsahuje takové slovo, že automat při výpočtu nad ním projde jedním stavem dvakrát. Toto je potřeba dokázat (není to těžké) a pak jen najít algoritmus, který hledá v grafu cykly a ověřuje, že alespoň pro jeden z cyklů platí alespoň jedna z podmínek:
a) cyklus obsahuje přijímající stav
b) cyklus lze někde opustit a dojít do přijímajícího stavu
EDITACE: ještě je potřeba, aby ten algoritmus ověřil, že jeden ze stavů v cyklu je dosažitelný
Všeobecně doporučuji přečíst
http://is.muni.cz/elportal/estud/fi/js0 … maty_I.pdf

Algoritmus lze jednoduše popsat také takto
* optimalizujeme vstupní automat
* ověříme, zda výsledný automat obsahuje "peklo" (tj. stav P, který není přijímající a z nějž se libovolným znakem dostaneme opět do P)
* zjistíme, zda automat obsahuje jiný cyklus než P->P. Pokud ano, je jazyk nekonečný, jinak je konečný.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#3 22. 05. 2008 17:40

Lares
Zelenáč
Příspěvky: 3
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Tak jsem nad tím dlouze bádal a narazil jsem na problém a to právě na ten polynomiální alogoritmus (možná to bude hloupý dotaz):
Mám automat, který má nekonečný jazyk (tj, obsahuje cyklus P->P a také další ne P->P cyklus), ale není mi jasné, jak z toho vyvořit polynomiální alg., protože tam nic polynomiálního nevidím. (Jedná se o jednoduchý automat s abecedou (a,b), kde počet "a" má být roven mod 3 = 1)

Díky za pomoc.

Offline

 

#4 23. 05. 2008 00:58

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Máme najít algoritmus pro konečné automaty. Tzn. program, který na začátku dostane popis toho automatu (v tvém případě mu zadáme množinu stavů
0,1,2, počáteční stav 0, přijímající 1 a přechodovou funkci
f(0,a)=1
f(1,a)=2
f(2,a)=0
f(0,b)=1
f(1,b)=1
f(2,b)=2)
a náš program z tohoto vstupu vyrobí "ano" nebo "ne" na podle toho, jestli je jazyk konečný nebo ne.
Náš algoritmus tedy (jak jsem psal) víceméně hledá v grafu cykly. Např. procházením do šířky zjistí, jestli se do nějakého stavu dostane cyklem.
Procházením do šířky proti směru hran pak zjistí, jestli se z tohoto cyklu lze dostat do nějakého přijímajícího stavu. Složitost algoritmu je |Q|.|S|, kde Q je množina stavů a S abeceda. Tato složitost je polynomiální.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#5 23. 05. 2008 11:13 — Editoval Lares (25. 05. 2008 13:59)

Lares
Zelenáč
Příspěvky: 3
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Snažím se to správně pochopit....

Předpokládám, že po nalezení cyklu prostě stačí ověřit, zda se z něj nějak nelze dostat do přijímacího stavu. Proti směru hrany mi nejde stále do hlavy.

Offline

 

#6 26. 05. 2008 18:04

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Lares napsal(a):

Po nalezení cyklu prostě stačí ověřit, zda se z něj nějak nelze dostat do přijímacího stavu.

To je ta myšlenka. Lze ji formulovat i naopak: ověřujeme, že se z přijímajícího stavu dostaneme do toho cyklu proti směru hran. (Kdyby hrany nebyly orientované, dostaneme se z cyklu do akceptujícíh stavu právě když se dostaneme z akceptujícího stavu do cyklu. Protože ale orientované jsou, ta formulace "proti směru hran" je důležitá.)


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#7 10. 12. 2008 16:35 — Editoval xy3000 (10. 12. 2008 16:39)

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Ahoj chci se zeptat hledně konečných automatů, podle čeho poznám, kdy automat změní stav ??? Např. stav S0 ->1  S1 , S1 ->0 S2, zarazilo mě že automat může změnit stav i při hodnotě 0 !  Vůbec to nechápu :-((.

Offline

 

#8 10. 12. 2008 17:32

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

↑ xy3000:Co to je konečný automat se dočteš na http://bart.math.muni.cz/~brkos/files/d … %C5%AF.pdf . Je tam vysvětlené kdy a jak mění stavy.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#9 10. 12. 2008 17:35

Lishaak
Veterán
Místo: Praha
Příspěvky: 763
Reputace:   
Web
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Nevim proc by automat nemohl zmenit stav pri precteni nuly. To, kdy automat meni stav, zavisi na tom, jak je navrzeny, to znamena. odkud kam vedou sipky. Na konrketnich prectenych symbolech nezalezi.

Mozna jsem ale taky spatne pochopil, na co se ptas. Mels na mysli nejaky konkretni automat pro nejaky konkretni jazyk?


Nothing in the world that's worth having comes easy.
Always do what you are most afraid of.

Offline

 

#10 10. 12. 2008 21:16 — Editoval xy3000 (10. 12. 2008 22:24)

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Třeba když bych měl  konečný automat který  přijímá regulární jazyk řetězců, které vyjadřují binární číslo dělitelné čtyřmi, tak budu mít stav S0, S1, S2,S3 - to je beze zbytku se zbytkem 1  se zbytkem 2 a se zbytkem 3. Podle čeho ale určím ty přechody a hodnoty kterou ponesou ???

Offline

 

#11 10. 12. 2008 22:36

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

↑ xy3000:V tomhle případě je potřeba si uvědomit, co dělá přidání binární cifry 0 nebo 1 na konec slova. Dělá to to, že původní číslo se vynásobí dvěma a ta cifra se přičte.
Konečný automat si o čísle pamatuje jen konečně mnoho informací. V našem případě zbytek po dělení třemi.
Ukážu teď, jak bude automat pracovat, když bude číst vstup 1110
Začínám ve stavu S0, takže to, co jsem načetl doteď, je tvaru 3k. Nyní načtu 1. Celé doteď načtené číslo je 2(3k)+1=3(2k)+1, což dává zbytek 1 po dělení 3. Musím se proto přesunout do S1. Načtu 1. Dosavadní číslo bylo 3n+1, nové je 2(3n+1)+1=3(2n+1), což je dělitelné 3, musím se přesunout do S0. Načtu zase 1. Už víme, že znakem 1 se z S0 dostaneme do S1. Jsme v S1 a načteme 0. Dosud načtené číslo bylo 3m+1, nyní se změnilo na 2(3m+1)+0=3(2m)+2, musím do S2.

Doufám, že je z tohoto příkladu jasné, jak automat funguje a jak doplnit zbylé hodnoty přechodové fce.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#12 10. 12. 2008 22:54 — Editoval xy3000 (10. 12. 2008 23:03)

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Kondr napsal(a):

↑ xy3000:V tomhle případě je potřeba si uvědomit, co dělá přidání binární cifry 0 nebo 1 na konec slova. Dělá to to, že původní číslo se vynásobí dvěma a ta cifra se přičte.
Konečný automat si o čísle pamatuje jen konečně mnoho informací. V našem případě zbytek po dělení třemi.
Ukážu teď, jak bude automat pracovat, když bude číst vstup 1110
Začínám ve stavu S0, takže to, co jsem načetl doteď, je tvaru 3k. Nyní načtu 1. Celé doteď načtené číslo je 2(3k)+1=3(2k)+1, což dává zbytek 1 po dělení 3. Musím se proto přesunout do S1. Načtu 1. Dosavadní číslo bylo 3n+1, nové je 2(3n+1)+1=3(2n+1), což je dělitelné 3, musím se přesunout do S0. Načtu zase 1. Už víme, že znakem 1 se z S0 dostaneme do S1. Jsme v S1 a načteme 0. Dosud načtené číslo bylo 3m+1, nyní se změnilo na 2(3m+1)+0=3(2m)+2, musím do S2.

Doufám, že je z tohoto příkladu jasné, jak automat funguje a jak doplnit zbylé hodnoty přechodové fce.

Díky za snahu to vysvětlit, je to teda automat na dělení třemi ??? Stále mi není jasné co je to 3k a co je konec slova.

Offline

 

#13 11. 12. 2008 01:32

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

↑ xy3000:Ty čísla k,m,n jsou přirozená čísla, o nichž víme, že existují, ale nezajímá nás jejich hodnota.

Z tvých reakcí mám ale pořád pocit, že nevíš, co to je automat. Hlavně neexistuje nic jako "automat na dělení třemi". Automat vždy rozpoznává nějaký jazyk. Např. jazyk všech slov, které obsahují jako svůj podřetězec "baba". Nebo jazyk všech slov liché délky. Nebo jazyk všech slov, která když přečteme jako binární číslo, bude to číslo dělitelné 3, což je náš případ. Automat má několik stavů. Tím, že je ve stavu S0 v našem případě říká "doteď jsem načetl číslo, které je tvaru 3k". Když je ve stavu S1, říká nám "doteď jsem načetl číslo, které je tvaru 3n+1". A konečně ve stavu S2 říká "načetl jsem 3m+2". O tom, jakou hodnotu mají k,n,m nic nevíme a vědět nepotřebujeme. Z toho, v jakém je stavu a jaký znak nově načetl, už umíme určit, do jakého stavu má přejít.

Pro to, jestli nakonec akceptuje nebo ne, je rozhodující stav, kdy se dostane na konec slova -- tzn. načte poslední znak a provede příslušnou změnu stavu.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#14 11. 12. 2008 11:07 — Editoval xy3000 (11. 12. 2008 11:08)

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Ještě prosím o vysvětlení 2(3k)+1=3(2k)+1, což dává zbytek 1 po dělení 3. Kde se vezme ten zbytek, respektive jaké číslo musím dělit.
Proč se přehodilo 3k za 2k v těch závorkách.

Offline

 

#15 11. 12. 2008 11:14 — Editoval ttopi (11. 12. 2008 11:16)

ttopi
Místo: Ústí nad Labem
Příspěvky: 2146
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Protože když zvolíš libovolné k, tak vidíš, že ho nejprve vynásobíš 2 a pak 3... Toto číslo by bylo zpětně dělitelné bezezbytku, protože ho získáš vynásobením 3. Jenže ty k tomu 3*(2*k) ještě přičítáš 1, čili když to pak zpětně dělíš 3 tak ta 1 bude vždy zbytek. Je to celkem jednoduché.
Když si zvolím k=2. Vynásobím ho 2 a mám 4. Tu když vynásobím 3 dostanu 12 (ale 12 je zpětně dělitelné bezezbytku, to je zřejmé). No a +1 =13. A 13/3=4+1 - tady vidíš, že podíl bude vždy 2k+1 právě proto, že to nejprve 3 násobíš a pak opět dělíš.

Přehodilo se to proto, že je to pak zřejmější. Přecijen z 2(3k)+1 není na první pohled vidět, že po dělení 3 to dá zbytek. Ale z 3(2k)+1 je to přímo vidět.

Pokud bys třeba chtěl vědět, jaký zbytek dá 2(3k)+1 po dělení 6, tak si napíšeš 2*3(k)+1=6k+1 - z toho je taky přímo vidět, že pro jakékoliv k bude výsledek dělitelný 6 (dokonce dostanem zpět k) se zbytkem 1.


oo^0 = 1

Offline

 

#16 11. 12. 2008 13:36

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

no a když by to načítalo číslo 1001 tak tedy, S0 3k, S1 3n+1, S2 3m+0 ???
Jde mě to o to jestli se v těch stavech to číslo přesne opisuje, nebo jak se ty hodnoty tam chovají.

Offline

 

#17 11. 12. 2008 13:47

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Nic se neopisuje. Auomat ví pouze v jakém je stavu a jaký znak právě načetl.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#18 11. 12. 2008 13:53

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Já vím že už s tím moc votravuju, docela už jsem to pochopil, akorát bych jeste prosil o podrobnější vysvětlení těch stavů, který automat právě načetl, stavy S0 , S1, S2. Jak jev tom příkladě číslo 1110    S0 - 3k, S1 3n+1, S2 3m +2 ??Třeba pro číslo 1001.

Offline

 

#19 11. 12. 2008 15:10

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Začínáme ve stavu S0. Načteme 1, 3k+1 dává zbytek 1, jdeme do S1. Načteme 0. Pak 2(3n+1)+0=3(2n)+2, jdeme do S2. Načteme 0, 2(3m+2)=3(2m+1)+1, jdeme do S1. Načteme 1,  2(3k+1)+1=3(2k+1), jdeme do S0. Skončili jsme načítání, jsme v akceptujícím stavu, slovo patří do jazyka.

To platí -- slovo odpovídá číslu 9=3*3.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#20 11. 12. 2008 15:49

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Kondr - moc díky už to chápu nebo si alespon myslím že to chápu. Poslední otázka pakuž dám pokoj :-). Pokusil jsem se zkonstruovat automat který bude přijímat binární čísla dělitelná čtyřmi. Měl jsem stavy S0,S1,S2,S3. Při výpočtech se mě ale stalo, že jsem přeskočil ze stavu S3 do stavu S1 prostě podle těch zbytků to tak vycházelo, je to dobře nebo blbě, asi blbě co ?

Offline

 

#21 11. 12. 2008 18:37

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Ze stavu S3 po načtení 0 musíme skočit do S2, po načtení 1 zpátky do S3, protože 2(4t+3)+0=4(2t+1)+2 a 2(4t+3)+1=4(2t+1)+3.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#22 11. 12. 2008 19:40

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Mám automat přijímající binární čísla dělitelná 4. Zkouším tam pustit číslo 7 - binárně 111 automat by měl skončit v S3. Stav S0 čtu 1 -> 2(4t) + 1 = 8t + 1 , zbytek podle tý jedničky je zbytek 1 tudíž stav S1. Dále stav S1 (8t + 1) = 2(8t+1) + 1 = 16t + 3 , 3:3, zbytek nula stav tedy S0, dále čtu 1 ze stavu S0 tudíž podle dřívějšího propočtu se dostanu z S0 doS1, ale měl bych být v S3, že?

Offline

 

#23 11. 12. 2008 19:51

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

↑ xy3000:Ber zbytky po dělení čtyřmi (tj. ne "3:3", jak píšeš...).


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#24 11. 12. 2008 20:08 — Editoval xy3000 (11. 12. 2008 20:59)

xy3000
Příspěvky: 34
Reputace:   
 

Re: Polynomiální algoritmus řešící konečnost jazyka

Kondr napsal(a):

↑ xy3000:Ber zbytky po dělení čtyřmi (tj. ne "3:3", jak píšeš...).

no jo to jsem vůl takže teda stav S1 -> 16t + 3 , 3:4 bohužel nevím jak definovat zbytek když dělitel je větší jak dělenec :-((.
Poslední, poslední otázka do jakého stavu půjde tento automat po stavu S1 a proč ??????????

Offline

 

#25 11. 12. 2008 21:15

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Polynomiální algoritmus řešící konečnost jazyka

3:4 - celá část podílu je 0, zbytek 3.

Co se týče toho tvého automatu: nad slovem 111 z výchozího S0 půjde do S1, pak do S3 a nakonec znovu do S3. Když je ve stavu S1 a načte 1, tak se hodnota dosud načteného čísla změní z 4t+1 na 2(4t+1)+1=4(2t)+3.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson