Skip to content
Browse chapters
Imports

General SUBSET-SUM is in NP

namespace CLRS.Chapter34 private theorem exists_bounded_mask_certificate_of_mem {input : List SubsetSumSym} (hmem : input ∈ GeneralSUBSETSUM) : ∃ certificate, certificate.length ≤ input.length + 2 ∧ Turing.SubsetSumVerifier.Final.concreteSubsetSumVerifier (certificate, input) = true := by rcases hmem with ⟨data, hdecode, hhas⟩ rcases (hasSubsetSum_iff_exists_finset data).1 hhas with ⟨chosen, hsum⟩ let mask := subsetMaskOfFinset chosen have hmask : data.MaskSumsTo mask := by rw [SubsetSumData.MaskSumsTo, subsetSumMaskOfFinset_sum] exact hsum refine ⟨encodeSubsetSumMask mask, ?_, ?_⟩ · rw [encodeSubsetSumMask_length] have hmaskLength : mask.length = data.values.length := by simp [mask, subsetMaskOfFinset] rw [hmaskLength] exact Nat.add_le_add_right (subsetSum_valueCount_le_input_length hdecode) 2 · exact (Turing.SubsetSumVerifier.Final.concreteSubsetSumVerifier_eq_true_iff _ _).2 ⟨data, mask, hdecode, rfl, hmask⟩theorem mem_generalSUBSETSUM_iff_exists_bounded_mask_certificate (input : List SubsetSumSym) : input ∈ GeneralSUBSETSUM ↔ ∃ certificate, certificate.length ≤ input.length + 2 ∧ Turing.SubsetSumVerifier.Final.concreteSubsetSumVerifier (certificate, input) = true := by constructor · exact exists_bounded_mask_certificate_of_mem · rintro ⟨certificate, _, haccept⟩ exact (Turing.SubsetSumVerifier.Final.mem_generalSUBSETSUM_iff_exists_concrete_certificate input).2 ⟨certificate, haccept⟩theorem generalSUBSETSUM_polyTimeVerifiable : PolyTimeVerifiable GeneralSUBSETSUM := by refine ⟨fun certificate input => Turing.SubsetSumVerifier.Final.concreteSubsetSumVerifier (certificate, input), Polynomial.X + 2, ?_, ?_⟩ · exact ⟨Turing.SubsetSumVerifier.Final.computableInPolyTime⟩ · intro input simpa [Polynomial.eval_add, Polynomial.eval_X] using mem_generalSUBSETSUM_iff_exists_bounded_mask_certificate inputtheorem SUBSETSUM_mem_ClassNP : SUBSETSUM ∈ ClassNP SubsetSumSym := (mem_ClassNP SUBSETSUM).2 generalSUBSETSUM_polyTimeVerifiableend CLRS.Chapter34