рдЕрдкреВрд░реНрдг рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде Quine \ McCluskey рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдпрд╣ рд▓реЗрдЦ рдХреБрдЫ рд╣рдж рддрдХ, Quine-Mac'Klaski рд╡рд┐рдзрд┐ ( https://habr.com/post/328506 ) рджреНрд╡рд╛рд░рд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдорд▓рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕реАрдзреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдирд┐рд╣рд┐рдд рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдорд╛рдорд▓рд╛ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИ рдЬрдм рдЗрдирдкреБрдЯ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИред рдЖрдВрд╢рд┐рдХ рдпрд╛ рдЕрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рдорд╛рди рдХреЗрд╡рд▓ рдкреВрд░реНрдг рд╕реЗрдЯ P = рд╕реЗ рднрд╛рдЧ Q рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рд╣реИрдВ 2рдПрдирд╕рдВрдЦреНрдпрд╛ N рдХреЗ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ (рдЪрд░) рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЗрдЯ (рд╢рдмреНрдж), рдпрд╛рдирд┐ Q <Pред рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЗрдирдкреБрдЯ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ N = 30 рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рддреНрддреАрдп рдмрд╛рдЬрд╛рд░реЛрдВ рдореЗрдВ, рддреЛ рдЗрдирдкреБрдЯ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдирдореВрдиреЗ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдХреНрд░рдо рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 230> 109рдЕрдиреВрдареЗ рдЕрдиреВрдареЗ рдкрджред рдбреЗрдЯрд╛ рдХрд╛ рдРрд╕рд╛ рд╡реНрдпреВ рд╣рд░ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╕рдВрдЧрдарди рдореЗрдВ рднреА рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛рдиреА рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд┐рдЧрдбрд╛рдЯрд╛ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЖрджрд┐ред

рдЗрд╕рд▓рд┐рдП, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдХреНрд╕рд░ рдХрдо рд╕реЗ рдХрдо рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрдЪрд┐рдд рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХрд╛рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ)ред рдкреНрд░рд╢реНрди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ "рдкрд░рд┐рдзрд┐" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдарддрд╛ рд╣реИ рдЬрдм рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рдЪрд░ (рд╢рдмреНрдж) рдХреЗ рдЕрдкреВрд░реНрдг рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдХреЛ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рдгрд╛рдо рджреЗред рд▓реЗрдХрд┐рди, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ = V рд╣реИред 2PтИТQрдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреНрдпреВ рдФрд░ рдкреА рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЦрдЧреЛрд▓реАрдп рд░реВрдк рд╕реЗ рдмрдбрд╝реА рд╣реИ рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд▓рд╛рдЧрдд рдХреЗ рдХрд╛рд░рдг рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореВрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрдзреБрдирд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рд╢реБрд░реВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХреЗред рдпрд╣ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдиреНрдпреВрдирддрдордХрд░рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЛ рд╢рд░реНрддреЛрдВ рдХреА рдЕрдкреВрд░реНрдг рд╕реВрдЪреА рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ FALSE (0) рдФрд░ TRUE (1) рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, Quine-Mac'Klaski рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╢рд┐рдХреНрд╖рдХ рдХреЗ рд╕рд╛рде рд╕реАрдЦрдиреЗ рдХреЗ рдкреНрд░рддрд┐рдорд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рдПрдХ рд╕рд╛рде рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдиреНрдпреВрдирддрд╛) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рдХреНрд╡реАрди-рдореИрдХ'рд▓рд╛рд╕реНрдХреА рдкрджреНрдзрддрд┐ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рджреЛ рдореБрдЦреНрдп рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  1. рд╕реНрдЯреЗрдЬред Gluing рдирд┐рдпрдореЛрдВ (рдХрд╛рдиреВрдиреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рднреА рд╕рд░рд▓ LF рд╢рд░реНрддреЗрдВ рдЦреЛрдЬрдирд╛:
    a) (A & B)? (A & B)? рдПрдХ;
    рдмреА) (рдП? рдмреА) рдФрд░ (рдП? рдмреА)? рдПрдХ;
    рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд╣рд╛рдВ рд╣реИ ?; - рддрд╛рд░реНрдХрд┐рдХ "рдпрд╛" рдХрд╛ рд╕рдВрдЪрд╛рд▓рди ;; - рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд╖реЗрдз рдХрд╛ рд╕рдВрдЪрд╛рд▓рди "рдирд╣реАрдВ"ред рдЗрди рд╕реВрддреНрд░реЛрдВ рд╕реЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╢рдмреНрдж рдПрдХ рд╕рд╛рде рдЪрд┐рдкрдХреЗ рд╣реБрдП рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдЪрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рджреЛ рд╢рдмреНрдж рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рдЗрди "*" рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореВрд▓ рдорд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рд╡рд░реНрдгрдорд╛рд▓рд╛ рддреАрди рдорд╛рдиреЛрдВ рддрдХ рд╡рд┐рд╕реНрддреГрдд рд╣реИ:
    тАв 0 => рдЕрд╕рддреНрдп;
    тАв 1 => рд╕рддреНрдп;
    тАв 2 => рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рдЪрд░ (*)ред
  2. рд╕реНрдЯреЗрдЬред рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдЧреНрд▓рд┐рдЯреЗрдб-рдЗрди рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдиреНрдпреВрдирддрдордХрд░рдг, рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рд╢рд░реНрддреЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯ рдХреЗ рдЗрд╖реНрдЯрддрдо рдХрд╡рд░реЗрдЬ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рд╣реИ рдХрд┐, рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рд╢рдмреНрдж рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд░реНрддреЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдмрд╕реЗрдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдЪреБрдиреЗрдВ рдЬреЛ рдХрд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рд╣реЛрдВред рдЙрдирдХреЗ рд╕рд╛рде, рдХреБрд▓ рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрд╢реЛрдВ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрдирдкреБрдЯ рд╢рд░реНрддреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдЯрд┐рдВрдЧ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдЕрд╡рдзрд┐ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рд╢рдмреНрдж рдХреЗ рд╡рд┐рдШрдЯрди рдХреЗ рдмрд┐рдЯрд╡рд╛рдЗрдЬ рдСрдкрд░реЗрд╢рди рдиреЗ рдПрдХ рд╕рд╣реА рдореВрд▓реНрдп рджрд┐рдпрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЪрд┐рдкрдХреЗ рд╢рдмреНрдж рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИ: 10 * 0110 *ред
    рдлрд┐рд░ рдЗрд╕рдореЗрдВ 10101100 рд╢рдмреНрдж рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
    10 * 0110 * & 10101100 = TRUE
    рд▓реЗрдХрд┐рди рдХрд╡рд░ рдирд╣реАрдВ рд╣реИ 00101100:
    10 * 0110 * рдФрд░ 00101100 = FALSE
    рдпрд╣реА рд╣реИ, рдЗрдирдкреБрдЯ рдЯрд░реНрдо рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╣рд░ рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ "*" рд╕рд┐рдВрдмрд▓ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕ рдкреЛрдЬреАрд╢рди рдореЗрдВ рдЗрдирдкреБрдЯ рдЯрд░реНрдо рдХрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛрдИ рднреА рд╡реИрд▓реНрдпреВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд░ рдХреЛ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ):
using System; using System.Collections.Generic; using System.Linq; #region   /// <summary> ///      /// </summary> public abstract class LogicFunction { // ""  public const byte cStarSymb = 2; //    public readonly ICollection<byte[]> Terms = new LinkedList<byte[]>(); //   public abstract bool Calculate(bool[] X); //   public abstract bool Calculate(char[] X); //   public abstract bool Calculate(byte[] X); } /// <summary> ///    /// </summary> public class Dnf : LogicFunction { public static bool Calculate(byte[] X, byte[] term) { bool bResult = true; for (int i = 0; i < term.Length; i++) { if ((term[i] == cStarSymb) || (term[i] == X[i])) continue; bResult = false; break; } return bResult; } public override bool Calculate(byte[] X) { bool bResult = false; foreach (byte[] term in Terms) { bool bTermVal = true; for (int i = 0; i < term.Length; i++) { if ((term[i] >= cStarSymb) || (term[i] == X[i])) continue; bTermVal = false; break; } //bResult |= bTermVal; if (bTermVal) { bResult = true; break; } } return bResult; } public override bool Calculate(char[] X) { bool bResult = false; foreach (byte[] term in Terms) { bool bTermVal = true; for (int i = 0; i < term.Length; i++) { if ((term[i] >= cStarSymb) || (term[i] == (byte)(X[i] == '0' ? 0 : 1))) continue; bTermVal = false; break; } //bResult |= bTermVal; if (bTermVal) { bResult = true; break; } } return bResult; } public override bool Calculate(bool[] X) { bool bResult = false; foreach (byte[] term in Terms) { bool bTermVal = true; for (int i = 0; i < term.Length; i++) { if ((term[i] >= cStarSymb) || ((term[i] != 0) == X[i])) continue; bTermVal = false; break; } //bResult |= bTermVal; if (bTermVal) { bResult = true; break; } } return bResult; } } #endregion /// <summary> ///   /// </summary> public class TreeFuncTerm { /// <summary> ///     /// </summary> public class TreeNodeEnd { } //    private readonly TreeNodeEnd pCommonTreeNodeEnd = new TreeNodeEnd(); //  private readonly object[] rootNode = new object[3]; // ()  private int _rang = 0; public int Rang { get { return _rang; } } //    private int enumerationPos = 0; private object[][] enumerationBuf; //,     private byte[] enumerationTerm; public byte[] EnumerationTerm { get { return enumerationTerm; } } //     private UInt32 _count = 0; public UInt32 Count { get { return _count; } } // public TreeFuncTerm() { Clear(); } //  public void Clear() { _count = 0; _rang = 0; enumerationPos = 0; enumerationBuf = null; enumerationTerm = null; rootNode[0] = rootNode[1] = rootNode[2] = null; } //      public TreeNodeEnd EnumerationInit() { enumerationPos = 0; enumerationTerm = new byte[_rang]; enumerationTerm[0] = 0; enumerationBuf = new object[_rang][]; enumerationBuf[0] = rootNode; //    return EnumerationNextNode(); } //     public TreeNodeEnd EnumerationNextNode() { int iIsNext = (enumerationPos > 0 ? 1 : 0); TreeNodeEnd pRetTreeNode = null; while ((pRetTreeNode == null) && (enumerationPos >= 0)) { object[] pCurrNodes = enumerationBuf[enumerationPos]; object pNextNode = null; int i = enumerationTerm[enumerationPos] + iIsNext; for (; i < 3; i++) if ((pNextNode = pCurrNodes[i]) != null) break; if (pNextNode == null) { //    enumerationPos--; iIsNext = 1; } else { enumerationTerm[enumerationPos] = (byte)i; if (pNextNode is object[]) { //    enumerationPos++; enumerationBuf[enumerationPos] = (object[])pNextNode; enumerationTerm[enumerationPos] = 0; iIsNext = 0; } else //if (pNextNode is TreeNodeEnd) { //   pRetTreeNode = (TreeNodeEnd)pNextNode; } } } return pRetTreeNode; } //     public void AddTerm(byte[] term) { _rang = Math.Max(_rang, term.Length); object[] pCurrNode = rootNode; int iTermLength1 = term.Length - 1; for (int j = 0; j < iTermLength1; j++) { byte cSymb = term[j]; object item = pCurrNode[cSymb]; if (item == null) { item = new object[3]; pCurrNode[cSymb] = item; } pCurrNode = (object[])item; } if (pCurrNode[term[iTermLength1]] == null) { //    pCurrNode[term[iTermLength1]] = pCommonTreeNodeEnd; _count++; } } //      public TreeNodeEnd Remove(byte[] term) { int iTermLength1 = term.Length - 1; object[] pCurrNode = rootNode; for (int i = 0; i < iTermLength1; i++) { pCurrNode = (object[])pCurrNode[term[i]]; if (pCurrNode == null) break; } TreeNodeEnd pRemovedNode = null; if (pCurrNode != null) { //      pRemovedNode = (TreeNodeEnd)pCurrNode[term[iTermLength1]]; if (pRemovedNode != null) { //     pCurrNode[term[iTermLength1]] = null; // -  _count--; } } return pRemovedNode; } //     public bool Contains(byte[] term) { object pCurrNode = rootNode; foreach (byte cSymb in term) { pCurrNode = ((object[])pCurrNode)[cSymb]; if (pCurrNode == null) break; } return ((pCurrNode != null) && (pCurrNode is TreeNodeEnd)); } } /// <summary> ///     ---- /// </summary> public class Quine_McCluskey { //    private readonly Dnf _result = new Dnf(); public Dnf Result { get { return _result; } } //    private readonly Dnf _resultNeg = new Dnf(); public Dnf ResultNeg { get { return _resultNeg; } } //     private static void Skleivanie(TreeFuncTerm X1Tree, TreeFuncTerm X2Tree, TreeFuncTerm NegativTree, IEnumerable<byte[]> InpNegTerms, Dictionary<int, LinkedList<byte[]>> OutResult, int iLevel) { LinkedList<byte[]> OutR = new LinkedList<byte[]>(); if (OutResult != null) OutResult.Add(iLevel, OutR); bool IsVirtSkleivOn = ((NegativTree != null) && (InpNegTerms != null) && (InpNegTerms.Count() != 0)); for (TreeFuncTerm.TreeNodeEnd x1 = X1Tree.EnumerationInit(); x1 != null; x1 = X1Tree.EnumerationNextNode()) { bool bIsSkleiv = false; byte[] pCurrTerm = X1Tree.EnumerationTerm; for (int iPos = 0; iPos < pCurrTerm.Length; iPos++) { byte cSymbSav = pCurrTerm[iPos]; if (cSymbSav == LogicFunction.cStarSymb) continue; //      pCurrTerm[iPos] = (byte)(1 - cSymbSav); if (X1Tree.Contains(pCurrTerm)) { bIsSkleiv = true; //,         if (cSymbSav == 1) { pCurrTerm[iPos] = LogicFunction.cStarSymb; //  X2Tree.AddTerm(pCurrTerm); } } //    ,    NegativTree else if (IsVirtSkleivOn && !NegativTree.Contains(pCurrTerm)) { bool bIsNotCanAdd = false; pCurrTerm[iPos] = LogicFunction.cStarSymb; //  foreach (byte[] NegTerm in InpNegTerms) { if (bIsNotCanAdd = Dnf.Calculate(NegTerm, pCurrTerm)) break; } if (!bIsNotCanAdd) { bIsSkleiv = true; X2Tree.AddTerm(pCurrTerm); } } pCurrTerm[iPos] = cSymbSav; } //    ,       if (!bIsSkleiv) OutR.AddLast((byte[])pCurrTerm.Clone()); } } //     private static UInt64 GetTermCode(byte[] pTerm) { UInt64 iMultip = 1, iCode = 0; for (int i = 0; i < pTerm.Length; i++) { iCode += (iMultip * pTerm[i]); iMultip *= 3; } return iCode; } //     private static byte[] GetTermByCode(UInt64 iCode, int iTermLength, byte[] pTerm = null) { if (pTerm == null) pTerm = new byte[iTermLength]; int iCounter = 0; while (iCode != 0) { pTerm[iCounter++] = (byte)(iCode % 3); iCode /= 3; } while (iCounter < iTermLength) pTerm[iCounter++] = 0; return pTerm; } //     private static void Skleivanie(ICollection<UInt64> X1Tree, ICollection<UInt64> X2Tree, ICollection<UInt64> NegativTree, IEnumerable<byte[]> InpNegTerms, Dictionary<int, LinkedList<byte[]>> OutResult, int iLevel, int iTermLength) { LinkedList<byte[]> OutR = new LinkedList<byte[]>(); if (OutResult != null) OutResult.Add(iLevel, OutR); byte[] pCurrTerm = new byte[iTermLength]; bool IsVirtSkleivOn = ((NegativTree != null) && (InpNegTerms != null) && (InpNegTerms.Count() != 0)); foreach (UInt64 x1 in X1Tree) { GetTermByCode(x1, iTermLength, pCurrTerm); bool bIsSkleiv = false; UInt64 iMultip = 1; for (int iPos = 0; iPos < iTermLength; iPos++) { byte cSymbSav = pCurrTerm[iPos]; //(byte)((x1 / iMultip) % 3); if (cSymbSav != LogicFunction.cStarSymb) { UInt64 iCode = (cSymbSav == 0 ? x1 + iMultip : x1 - iMultip); //      if (X1Tree.Contains(iCode)) { bIsSkleiv = true; //,         if (cSymbSav == 1) { X2Tree.Add(x1 + iMultip); } } //    ,    NegativTree else if (IsVirtSkleivOn && !NegativTree.Contains(iCode)) { bool bIsNotCanAdd = false; pCurrTerm[iPos] = LogicFunction.cStarSymb; //  foreach (byte[] NegTerm in InpNegTerms) { if (bIsNotCanAdd = Dnf.Calculate(NegTerm, pCurrTerm)) break; } pCurrTerm[iPos] = cSymbSav; if (!bIsNotCanAdd) { bIsSkleiv = true; X2Tree.Add(x1 + (byte)(LogicFunction.cStarSymb - cSymbSav) * iMultip); } } } iMultip *= 3; } //    ,       if (!bIsSkleiv) OutR.AddLast((byte[])pCurrTerm.Clone()); } } //      //       private static void DeleteDublicatingTerms(IEnumerable<byte[]> InX1, ICollection<UInt64> OutX2Tree) { OutX2Tree.Clear(); foreach (byte[] x1 in InX1) { UInt64 iCode = GetTermCode(x1); if (OutX2Tree.Contains(iCode)) continue; OutX2Tree.Add(iCode); } } //      //       private static void DeleteDublicatingTerms(IEnumerable<byte[]> InX1, TreeFuncTerm OutX2Tree) { OutX2Tree.Clear(); foreach (byte[] x1 in InX1) OutX2Tree.AddTerm(x1); } //    private static bool IsEqualTerms(byte[] pTermC, byte[] pTermB) { if ((pTermC == null) || (pTermB == null) || (pTermC.Length != pTermB.Length)) return false; bool bIsEqual = false; int iLength = Math.Min(pTermC.Length, pTermB.Length); for ( int i = 0; i < iLength; i++) { if (!(bIsEqual = (pTermB[i] == pTermC[i]))) break; } return bIsEqual; } //            private static void ReduceRedundancyTerms(LinkedList<byte[]> InpTerms, Dictionary<int, LinkedList<byte[]>> SkleivTerms, ICollection<byte[]> ResultTerms) { if ((InpTerms == null) || (SkleivTerms == null) || (ResultTerms == null)) return; //   ResultTerms.Clear(); //        ,    Dictionary<byte[], HashSet<byte[]>> Outputs2Inputs = new Dictionary<byte[], HashSet<byte[]>>(); //        ,    Dictionary<byte[], HashSet<byte[]>> Inputs2Outputs = new Dictionary<byte[], HashSet<byte[]>>(); //    foreach (int iLevel in SkleivTerms.Keys.OrderByDescending(p => p).AsEnumerable()) { //       foreach (byte[] outTerm in SkleivTerms[iLevel]) { //  ,      term HashSet<byte[]> InpTermsLst = new HashSet<byte[]>(); //     foreach (byte[] inpTerm in InpTerms) { if (Dnf.Calculate(inpTerm, outTerm)) { InpTermsLst.Add(inpTerm); if (!Inputs2Outputs.ContainsKey(inpTerm)) Inputs2Outputs.Add(inpTerm, new HashSet<byte[]>()); Inputs2Outputs[inpTerm].Add(outTerm); } } Outputs2Inputs.Add(outTerm, InpTermsLst); } } //      -    Inputs2Outputs = Inputs2Outputs.OrderBy(p => p.Value.Count).ToDictionary(p => p.Key, v => v.Value); //   ,   -    while (Inputs2Outputs.Count > 0) { byte[] outTerm = Inputs2Outputs.First().Value.OrderByDescending(q => Outputs2Inputs[q].Count()).First(); ResultTerms.Add(outTerm); foreach (byte[] inpTerm in Outputs2Inputs[outTerm].ToArray()) { foreach (byte[] outTerm2Del in Inputs2Outputs[inpTerm]) Outputs2Inputs[outTerm2Del].Remove(inpTerm); Inputs2Outputs.Remove(inpTerm); } } } //    public static void LogicFuncMinimize(IEnumerable<byte[]> PositivTerms, ICollection<byte[]> OutPos, IEnumerable<byte[]> NegativTerms, ICollection<byte[]> OutNeg) { int iTotalLevels = (PositivTerms.Count() > 0 ? PositivTerms.First().Length : (NegativTerms != null && NegativTerms.Count() > 0 ? NegativTerms.First().Length : 0)); Dictionary<int, LinkedList<byte[]>> SkleivPosTerms = new Dictionary<int, LinkedList<byte[]>>(iTotalLevels); Dictionary<int, LinkedList<byte[]>> SkleivNegTerms = new Dictionary<int, LinkedList<byte[]>>(iTotalLevels); LinkedList<byte[]> InpPosTerms = new LinkedList<byte[]>(); LinkedList<byte[]> InpNegTerms = new LinkedList<byte[]>(); if (iTotalLevels < 40) { HashSet<UInt64> X1PositivTree = new HashSet<UInt64>(); DeleteDublicatingTerms(PositivTerms, X1PositivTree); HashSet<UInt64> X1NegativTree = null; if (NegativTerms != null) { X1NegativTree = new HashSet<UInt64>(); DeleteDublicatingTerms(NegativTerms, X1NegativTree); //        foreach(UInt64 iNumb in X1PositivTree.Intersect(X1NegativTree)) { // -    X1   NegativTerms int iPos_Count = PositivTerms.Count(p => GetTermCode(p) == iNumb); int iNeg_Count = NegativTerms.Count(p => GetTermCode(p) == iNumb); if (iPos_Count > iNeg_Count) { X1NegativTree.Remove(iNumb); } else if (iPos_Count < iNeg_Count) { X1PositivTree.Remove(iNumb); } else //if (iPos_Count == iNeg_Count) { X1PositivTree.Remove(iNumb); X1NegativTree.Remove(iNumb); } } //           foreach (UInt64 code in X1NegativTree) { InpNegTerms.AddLast(GetTermByCode(code, iTotalLevels)); } } //          foreach (UInt64 code in X1PositivTree) { InpPosTerms.AddLast(GetTermByCode(code, iTotalLevels)); } int iLevelCounter = 0; //        while ((X1PositivTree.Count != 0) && (iLevelCounter < iTotalLevels)) { HashSet<UInt64> X2PositivTree = new HashSet<UInt64>(); Skleivanie(X1PositivTree, X2PositivTree, X1NegativTree, InpNegTerms, SkleivPosTerms, iLevelCounter, iTotalLevels); if ((X1NegativTree != null) && (X1NegativTree.Count != 0)) { HashSet<UInt64> X2NegativTree = new HashSet<UInt64>(); Skleivanie(X1NegativTree, X2NegativTree, X1PositivTree, InpPosTerms, SkleivNegTerms, iLevelCounter, iTotalLevels); //   X1NegativTree.Clear(); X1NegativTree = X2NegativTree; } //   X1PositivTree.Clear(); X1PositivTree = X2PositivTree; iLevelCounter++; GC.Collect(); } } else { TreeFuncTerm X1PositivTree = new TreeFuncTerm(); DeleteDublicatingTerms(PositivTerms, X1PositivTree); TreeFuncTerm X1NegativTree = null; if (NegativTerms != null) { X1NegativTree = new TreeFuncTerm(); DeleteDublicatingTerms(NegativTerms, X1NegativTree); //         for (TreeFuncTerm.TreeNodeEnd x1 = X1PositivTree.EnumerationInit(); x1 != null; x1 = X1PositivTree.EnumerationNextNode()) { if (!X1NegativTree.Contains(X1PositivTree.EnumerationTerm)) continue; // -    PositivTerms   NegativTerms int iPos_Count = PositivTerms.Count(p => IsEqualTerms(p, X1PositivTree.EnumerationTerm)); int iNeg_Count = NegativTerms.Count(p => IsEqualTerms(p, X1PositivTree.EnumerationTerm)); if (iPos_Count > iNeg_Count) { X1NegativTree.Remove(X1PositivTree.EnumerationTerm); } else if (iPos_Count < iNeg_Count) { X1PositivTree.Remove(X1PositivTree.EnumerationTerm); } else //if (iPos_Count == iNeg_Count) { X1PositivTree.Remove(X1PositivTree.EnumerationTerm); X1NegativTree.Remove(X1PositivTree.EnumerationTerm); } } //           for (TreeFuncTerm.TreeNodeEnd x1 = X1NegativTree.EnumerationInit(); x1 != null; x1 = X1NegativTree.EnumerationNextNode()) { InpNegTerms.AddLast((byte[])X1NegativTree.EnumerationTerm.Clone()); } } //          for (TreeFuncTerm.TreeNodeEnd X1Term = X1PositivTree.EnumerationInit(); X1Term != null; X1Term = X1PositivTree.EnumerationNextNode()) { InpPosTerms.AddLast((byte[])X1PositivTree.EnumerationTerm.Clone()); } int iLevelCounter = 0; //        while ((X1PositivTree.Count != 0) && (iLevelCounter < iTotalLevels)) { TreeFuncTerm X2PositivTree = new TreeFuncTerm(); Skleivanie(X1PositivTree, X2PositivTree, X1NegativTree, InpNegTerms, SkleivPosTerms, iLevelCounter); if ((X1NegativTree != null) && (X1NegativTree.Count != 0)) { TreeFuncTerm X2NegativTree = new TreeFuncTerm(); Skleivanie(X1NegativTree, X2NegativTree, X1PositivTree, InpPosTerms, SkleivNegTerms, iLevelCounter); //   X1NegativTree.Clear(); X1NegativTree = X2NegativTree; } //   X1PositivTree.Clear(); X1PositivTree = X2PositivTree; iLevelCounter++; GC.Collect(); } } //       ReduceRedundancyTerms(InpPosTerms, SkleivPosTerms, OutPos); //       ReduceRedundancyTerms(InpNegTerms, SkleivNegTerms, OutNeg); } //  public void Start(IEnumerable<byte[]> TermsInput) { LogicFuncMinimize(TermsInput, _result.Terms, null, null); } //  public void Start(IEnumerable<byte[]> TermsInput, IEnumerable<byte[]> NegativTerms) { LogicFuncMinimize(TermsInput, _result.Terms, NegativTerms, _resultNeg.Terms); } //  public void Start(IEnumerable<char[]> TermsInput) { Start(TermsInput.Select(t => t.Select(p => (byte)(p == '0' ? 0 : 1)).ToArray())); } //  public void Start(IEnumerable<char[]> TermsInput, IEnumerable<char[]> NegativTerms) { Start(TermsInput.Select(t => t.Select(p => (byte)(p == '0' ? 0 : 1)).ToArray()), NegativTerms.Select(t => t.Select(p => (byte)(p == '0' ? 0 : 1)).ToArray())); } //  public void Start(IEnumerable<bool[]> TermsInput) { Start(TermsInput.Select(t => t.Select(p => (byte)(p ? 1 : 0)).ToArray())); } //  public void Start(IEnumerable<bool[]> TermsInput, IEnumerable<bool[]> NegativTerms) { Start(TermsInput.Select(t => t.Select(p => (byte)(p ? 1 : 0)).ToArray()), NegativTerms.Select(t => t.Select(p => (byte)(p ? 1 : 0)).ToArray())); } public void PrintResult() { Console.WriteLine("--------Otvet-------"); char[] pTermSymbs = new char[] { '0', '1', '*' }; foreach (byte[] Term in _result.Terms) { for (int j = 0; j < Term.Length; j++) { Console.Write(pTermSymbs[Term[j]].ToString() + " "); } Console.WriteLine(); } } } 



Quine_McCluskey рд╡рд░реНрдЧ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: Dnf, TreeNodeBase, TreeNodeMiddle, TreeNodeEnd, TreeFuncTermред рдЕрдиреБрдХреВрд▓рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдУрд╡рд░рд▓реЛрдбреЗрдб рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ LogicFuncMinimize рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреНрдпреВрдирддрдордХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдиреНрдпреВрдирддрдордХрд░рдг рддрдВрддреНрд░ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
тАв рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП .NET рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
тАв TreeFuncTerm ternary рдЯреНрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд .NET рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред

рдЧрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпреЗ рджреЛ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реИрдВ (.NET рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рддреЗрдЬ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдЯреНрд░реАрдлрдВрдХрдЯрд░реНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрдИ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИ:
тАв рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк, 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрд╢ рдХреЛрдб рдФрд░ SortedSet .NET рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХреЗрд╡рд▓ 40 рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдирдкреБрдЯ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ .h рдХреЛрдб рдЧреНрд░рд┐рдб рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдВрдЯреЗрдирд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЪреВрдВрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдВрджрд░ рддрд┐рд░рдЫреЗ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЪрд┐рдкрдХреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ 41 рдХреЗ рдмрд░рд╛рдмрд░ рдЗрдирдкреБрдЯ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рд╣реИрд╢ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 341рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ 264-1, рдЬрд┐рд╕реЗ 64 рдмрд┐рдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЪрд░ рдХреЗ рд╕рд╛рде, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдЦрдХ рдХреЗ рдЯрд░реНрдирд░реА рдЦреЛрдЬ рдЯреНрд░реА рдЯреНрд░реАрдлрдВрдХрдЯрд░реНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред
тАв .NET рдХреЗ рдХрдВрдЯреЗрдирд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред
тАв рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ .NET рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдореБрдХреНрдд рд╣реИ, рдЬрд┐рд╕реЗ рдЙрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░, FPGAs, рдЖрджрд┐ рдореЗрдВ)ред
TreeFuncTerm рдЦреЛрдЬ рдЯреНрд░реА рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдЯреНрд░реАрдиреЛрдбрдорд╛рдбрд▓ рдФрд░ рдЯреНрд░реАрдиреЛрдбрдПрдб рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдЯреНрд░реАрдиреЛрдбрдмреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдЯреНрд░реАрдиреЛрдбрдорд╛рдбрд▓ рдХреНрд▓рд╛рд╕ рдкреЗрдбрд╝ рдХрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдиреЛрдб рд╣реИ, рдФрд░ рдЯреНрд░реАрдиреЛрдбреЗрдиреНрдб рдХреНрд▓рд╛рд╕ рдкреЗрдбрд╝ рдХрд╛ рдкрддреНрддреА рдЫреЛрд░ рд╣реИред EnumerationInit () рдФрд░ EnumerationNextNode () рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, TreeNodeEnd рдХреЗ рд╕рднреА рдкрддреНрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрдВрддреНрд░ рдХреЛ рдкреЗрдбрд╝ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред EnumerationInit () рдлрд╝рдВрдХреНрд╢рди рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЗрдбрд╝ рдореЗрдВ рдкрд╣рд▓рд╛ рдкрддреНрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред EnumerationNextNode () рдлрд╝рдВрдХреНрд╢рди рдЕрдЧрд▓реЗ рдЯреНрд░реА рдкрддреНрддреА рдпрд╛ NULL рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкрддреНрддреЗ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╣рд╛рдпрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ EnumerationTerm, рдЬреЛ рдкреЗрдбрд╝ рдХреЗ рдЕрдВрджрд░ рдЦреЛрдЬ "рдХрд░реНрд╕рд░" рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ, рдЯрд░реНрдирд░реА рд▓реЙрдЬрд┐рдХ {0,1,2} рдореЗрдВ рдорд┐рд▓реА рд╢реАрдЯ рдХрд╛ рд╢рдмреНрдж рдХреЛрдб рднреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреЗрдбрд╝ рд╕реЗ рдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЪрдпрди рдХрд╛ рдХреНрд░рдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  1. рддреИрдпрд╛рд░ рдХрд░рдирд╛ред рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LogicFuncMinimize рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЗрдирдкреБрдЯ рджреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ PositivTerms рдФрд░ NegativTerms рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА (TRUE, 1) рдФрд░ рдЧрд▓рдд (FALSE, 0) рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрди рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдирдиреНрдп рд╢рдмреНрджреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛ, рдЬреЛ рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВред рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЕрдирдиреНрдп рдЗрдирдкреБрдЯ рд╢рдмреНрдж рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╢рдмреНрдж рджреЛрдиреЛрдВ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╢рдмреНрдж рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрджреНрд╡рд┐рддреАрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рд╕рдВрдмрдВрдзред рдЕрдЧрд▓рд╛, gluing рдЗрдирдкреБрдЯ рд╢рд░реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрдХреНрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЧреНрд▓рд┐рд╕реНрдб рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЪрд┐рд╣реНрди * рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЪрд░ N рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА ред рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЧреНрд▓реВрдЗрдВрдЧ рдЗрдирдкреБрдЯ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХрд┐рд▓реЗрд╡рдиреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рди рдХреЗрд╡рд▓ рдЗрд╕рдХреА рд╕реВрдЪреА рд╕реЗ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЧреЛрдВрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╢рдмреНрдж рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдПрдХ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рддрдерд╛рдХрдерд┐рдд "рдЖрднрд╛рд╕реА" рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╣реИред "рдЖрднрд╛рд╕реА" рд╢рдмреНрджреЛрдВ рд╕реЗ рд╣рдорд╛рд░рд╛ рдорддрд▓рдм рдХреГрддреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢рдмреНрджреЛрдВ рд╕реЗ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдХреЗ рд╕реЗрдЯ рдХреА рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЧреНрд▓реВрдЗрдВрдЧ рдХреЗрд╡рд▓ рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм "рдЖрднрд╛рд╕реА" рд╢рдмреНрдж рд╡рд┐рдкрд░реАрдд рд╕реВрдЪреА рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯ рдХреЗ рдПрдХ рднреА рд╢рдмреНрдж рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
    Skleivanie рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рджреЛ рдмрд╛рд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╣рд▓реА рдХреЙрд▓ рдореЗрдВ PositivTerms рдФрд░ NegativTerms рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рдЙрдирдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛ, рдФрд░ рджреВрд╕рд░реА рдХреЙрд▓ рдореЗрдВ, PositivTerms рдФрд░ NegativTerms рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд╕реНрдкрд░ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, PositivTerms рд╕реВрдЪреА рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рд╢рдмреНрдж рд╣реИрдВ, рдФрд░ NegativTerms рд╕реВрдЪреА рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╢рдмреНрдж рд╣реИрдВ:
    рд╕реНрдХреЗрд▓реЗрд╡рдиреНрдиреА (X1PositivTree, ..., X1NegativTree, ..., рд╕реНрдХреЗрд▓реЗрд╡рд┐рдЯрд░реНрдо, ...);
    рд╕реНрдХреЗрд▓реЗрд╡рдиреА (X1NegativTree, ..., X1PositivTree, ..., null, ...);
    рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╢рд░реНрддреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рдЕрдиреНрдпреЛрдиреНрдпрд╛рд╢реНрд░рд┐рдд gluing рд╣реЛрддрд╛ рд╣реИред
    рдпрджрд┐ рдЗрд╕ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рдкрдж рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕рд╕реЗ рднрд┐рдиреНрди рд╣реИ, рди рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рди рд╣реА рдЖрднрд╛рд╕реА, рдЕрд░реНрдерд╛рдд, рд╢рдмреНрдж рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЪрд░рдг 1 рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЗрд╕рдореЗрдВ рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ ReduceRedundancyTerms рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЪрд░рдг 2 рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдПред рдЧреИрд░-рдЪрд┐рдкрдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рд╕реНрдХреЗрд▓реЗрд╡рдиреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдкрд░ рдХреЗрд╡рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреЙрдЬрд╝рд┐рдЯрд┐рд╡рдЯрд░реНрдо рдФрд░ рдиреЗрдЧрд╛рдЯрд┐рд╡рдЯрд░реНрдо рдХреА рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рдЙрдирдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд░рдиреЗ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░ред
  3. рдХрдореАред Redundant рд╕рд░реЗрд╕ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реБрдЖ рд╢рдмреНрджреЛрдВ рдХреЛ ReduceRedundancyTerms рдореЗрдВ рдЪрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдореВрд▓ рд╕реЗрдЯ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╡рд░реЗрдЬ, рдЬреЛ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╣реИ, "рдиреНрдпреВрдирддрдо рдХреЙрд▓рдо - рдЕрдзрд┐рдХрддрдо рдкрдВрдХреНрддрд┐" рдкрджреНрдзрддрд┐ (рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, http://www.studfiles.ru/preview-5175815/page:4 ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╡рд░реЗрдЬ рддрд╛рд▓рд┐рдХрд╛ (рдЯреАрдкреА) рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред ред
    рдЙрдирдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рддрд░реНрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
    0. рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡рд░реНрддрдорд╛рди рд░реВрдкрд╛рдВрддрд░рд┐рдд рдЯреАрдкреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╡рд░реЗрдЬ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕реЗрдЯ рдЦрд╛рд▓реА рд╣реИ;
    1. рд╡рд░реНрддрдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдо рдЗрдХрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдХреЙрд▓рдо рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ, рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкрдВрдХреНрддрд┐ рдХрд╡рд░реЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЛ рд╣рдЯрд╛рдХрд░ рд╡рд░реНрддрдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрдпрдирд┐рдд рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдЗрдХрд╛рдИ рд╣реЛрддреА рд╣реИред
    2. рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдкрд╛рд░ рдХрд┐рдП рдЧрдП рдХреЙрд▓рдо рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЪрд░рдг 1 рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рдХрд╡рд░реЗрдЬ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреЛрдЯ: рдЬрдм рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдЪрд┐рд╣реНрдирд┐рдд рдХреЙрд▓рдо рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
    рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╖реНрдЯрддрдо рдХреЗ рдХрд░реАрдм рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
    рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ TestQoodleMcCluskeyRandomPart, рдЬреЛ рд╕рдВрднрд╡ рд╢рд░реНрддреЛрдВ рдХреЗ рдХреБрд▓ рд╕реЗрдЯ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, 2рдПрдирдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдХреЗрд╡рд▓ рджрд┐рдП рдЧрдП рднрд╛рдЧ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ 0 <dPart <= 1 (рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░), рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ dPart <1 рдХреЗ рд╕рд╛рде, рдЗрдирдкреБрдЯ рд╢рд░реНрддреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ dPart = 1 рдХреЗ рд╕рд╛рде, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

TestQoodleMcCluskeyRandomPart (рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ)
 public static void TestQuineMcCluskeyRandomPart(int iVariableAmount, double dPart=1) { if (dPart < 0) throw new ArgumentException(" dPart    0   1"); if (dPart > 1) dPart = 1; //   ulong iTotalCombines = (ulong)1 << iVariableAmount; LinkedList<byte[]> pTrueCol = new LinkedList<byte[]>(); LinkedList<byte[]> pFalseCol = new LinkedList<byte[]>(); HashSet<ulong> pUsedTerms = new HashSet<ulong>(); Random rnd = new Random(); byte[] buf = new byte[8]; while (pUsedTerms.LongCount() < (iTotalCombines * dPart)) { rnd.NextBytes(buf); ulong iCurValue = (ulong)BitConverter.ToInt64(buf, 0) % iTotalCombines; if (pUsedTerms.Contains(iCurValue)) { //  -     do { iCurValue = ++iCurValue % iTotalCombines; } while (pUsedTerms.Contains(iCurValue)); } pUsedTerms.Add(iCurValue); byte[] sLine = new byte[iVariableAmount]; for (int i = 0; i < iVariableAmount; i++) { sLine[i] += (byte)(iCurValue % 2); iCurValue >>= 1; } if (rnd.Next(2) != 0) { pTrueCol.AddLast(sLine); } else { pFalseCol.AddLast(sLine); } } //   DateTime DtStart = DateTime.Now; Console.WriteLine(" - " + DtStart.ToLongTimeString()); Quine_McCluskey Logic = new Quine_McCluskey(); Logic.Start(pTrueCol, pFalseCol); DateTime DtEnd = DateTime.Now; Logic.PrintResult(); Console.WriteLine(" - " + DtStart.ToLongTimeString()); Console.WriteLine(" - " + DtEnd.ToLongTimeString()); TimeSpan Elapsed = DtEnd - DtStart; Console.WriteLine(" - " + String.Format("{0:00}:{1:00}:{2:00}", Elapsed.Hours, Elapsed.Minutes, Elapsed.Seconds)); //  int iErrorsCounter = 0; foreach (byte[] kvp in pTrueCol) { if (Logic.Result.Calculate(kvp) != true) iErrorsCounter++; } foreach (byte[] kvp in pFalseCol) { if (Logic.Result.Calculate(kvp) != false) iErrorsCounter++; } Console.WriteLine("-   = " + pUsedTerms.Count); Console.WriteLine("-   = " + Logic.Result.Terms.Count); Console.WriteLine("-  = " + iErrorsCounter); Console.ReadLine(); } 



рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдиреНрдпреВрдирддрдо рд╡рд┐рдШрдЯрдирдХрд╛рд░реА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдореВрд▓ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдпрд╣ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рджреЛ рдЕрдкреВрд░реНрдг рд╕реЗрдЯреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдиреНрдпреВрдирддрдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рд╛рдзрди рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рддрд╛рд░реНрдХрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреНрд░рдорд╢рдГ TRUE рдФрд░ FALSE рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЗрдирдкреБрдЯ рддрд╛рд░реНрдХрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рдЕрдиреНрдп рд╢рд░реНрддреЛрдВ рдХреА рд╕реВрдЪреА рдЗрдирдкреБрдЯ рд╣реЛрддреА рд╣реИред рдПрдХ рдЦрд╛рдореА рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдХреЗрд▓реЗрд╡рдиреА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╕реНрд░реЛрдд рд╢рдмреНрджреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрднрд╛рд╕реА рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╡рд░реЗрдЬ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдордп рд▓рд╛рдЧрдд рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi424517/


All Articles