<p>First of all, you must justify why the class is important enough to have a name. With $ 2^{ 2^{ \mathbb{N}_0 } }$ classes lying around we can afford to be very picky. So, assuming your research has led you to define an interesting property the problems in class have (this can be semantic or syntactic), let's call it "property X" you should first investigate the class on your own. I would try to answer the following questions:</p>

<ul>
<li><p>First step: Investigate the literature in the related research area. Has a class on objects from your research been defined? Ask experts in the area: "are there any known classes about this?". A little time spent asking might allow you to avoid losing time on something that is already known. So, let's assume you asked around and you have decided your class is unique enough and relevant to deserve study.</p></li>
<li><p>Does "property X" specify a computation model? Is the model randomized or non-deterministic? Is the model uniform? </p></li>
<li><p>How does your class behave under "usual" operations (union, complement, transitive closure etc.) . Note that if you work on a specific computation model, some questions may be trivial or easy to answer.</p></li>
<li><p>How does your class compare to other known classes? If it's a specific model, how does it compare to "canonical" classes of that model (e.g. $\mathbb{NP}$ for non-deterministic  TM, $\mathbb{BPP}$ for randomized TM, and so on)? Did you find some interesting closure property (e.g. is your class closed under complement? then perhaps non-determinism isn't a good framework to go on).</p></li>
<li><p>How do well-known problems compare with your class? Does it contain complete problems, i.e. can you make it so that a well-known problem has "property X"? If you cannot, for what known notions of reductions is your class closed under? If those you know don't fit the class, can you use the closure properties you found above to define one that does and is less powerful than the class itself?</p></li>
<li><p>Can you find problems that are hard for your class under some reduction that makes sense from the above step? Are they complete too? How do these problems compare with the well-known problems you investigated in the previous point? The problem &lt; L | L has property X > should be hard for the class. Is it also complete?</p></li>
</ul>

<p>Now, for most classes you should probably not be able to answer <strong>all</strong> those questions, but you can answer <em>some</em>, maybe most of them. Now you have an idea how this class behaves and whether it would be interesting for your line of research. If you deem it worthy, you can start asking people from the area, e.g. your advisor or a faculty that is familiar with the subject, what they think. </p>

CC BY-SA 3.0
2014-05-14T15:34:48.253Z
I would add to the list of "usual" operations: closure under various types of reductions (such as $AC^0$-reductions, poly-time many-one reductions, poly-space many-one reductions, poly-time Turing reductions, etc.)
Joshua Grochow
CC BY-SA 3.0
2014-05-14T06:17:56.213Z
2014-05-14T06:17:56.213Z
chazisop
<p>First you would search around and check <em>e.g.</em> the <a href="https://complexityzoo.uwaterloo.ca" rel="nofollow noreferrer">complexity zoo</a>, because many, many classes are already defined and you don't want to redefine one that is already known by some other name.</p>

<p>The ways I know of are:</p>

<ul>
<li>Define a complete problem and a notion of reduction; the class consists of all problems so reducible to that problem. This is usually only possible for so-called "syntactic" complexity classes -- see the question <a href="https://cstheory.stackexchange.com/questions/1233/semantic-vs-syntactic-complexity-classes">"Semantic vs Syntactic Complexity Classes"</a> -- which tend to also have a nice definition in terms of a model of computation. (E.g. $\mathsf{NP}$ can be defined as all languages that are polytime mapping-reducible to $\mathsf{3SAT}$; or as all languages decidable by a polytime nondeterministic TM.)</li>
<li>Define a model of computation and what it means for that model to decide/compute a language/problem; the class consists of all languages/problems for which there exists such a model of computation that decides/computes the language/problem. This works for probabilistic classes like $\mathsf{BPP}$, but also for more exotic models like quantum classes, circuits, interactive protocols, or finite automata for that matter. This is probably the method you'd go for, and for more detail, maybe look at examples of all the above types (e.g. $\mathsf{BPP, BQP, ACC, IP, MA, PCP, REGULAR}$).</li>
</ul>

<p>Perhaps those more expert than I am can say if there are other major methods that are missing, or expand on these if needed.</p>

CC BY-SA 3.0
2014-05-14T03:03:32.740Z
2014-05-14T03:03:32.740Z
2017-04-13T12:32:28.080Z
usul
<p>If I wanted to define my own complexity class would you first define it as a set of problems with reductions to those problems? How would one go about doing this?</p>

CC BY-SA 3.0
2014-05-14T15:36:46.503Z
I think most important is to first have to ask yourself *why* you want to define a new complexity class. The answer to that should also essentially be the answer to your original question. Complexity classes can be and are defined in many different ways - compare, e.g., the definitions of DET, NP, BPP, PPAD, TFNP, MAX-SNP, NC^1 (uniform and nonuniform). But despite their varied definitions they all had a good underlying motivation. If you have a good motivation for defining a certain class of problems, it probably shouldn't matter if it fits the standard mold of complexity class definitions.
Joshua Grochow
<cc.complexity-theory><reference-request>
if I were to define a new complexity class how should I start?
Joshua Herman
# if I were to define a new complexity class how should I start?

(Asked by: username_0 on 2014-05-14)

If I wanted to define my own complexity class would you first define it as a set of problems with reductions to those problems? How would one go about doing this?

**Tags:** cc.complexity-theory, reference-request

> **Comments:**
> **username_1**: I think most important is to first have to ask yourself *why* you want to define a new complexity class. The answer to that should also essentially be the answer to your original question. Complexity classes can be and are defined in many different ways - compare, e.g., the definitions of DET, NP, BPP, PPAD, TFNP, MAX-SNP, NC^1 (uniform and nonuniform). But despite their varied definitions they all had a good underlying motivation. If you have a good motivation for defining a certain class of problems, it probably shouldn't matter if it fits the standard mold of complexity class definitions.  

---

## 2 answers

### Answer by username_3 on 2014-05-14. Score: 12 | Accepted answer

First you would search around and check *e.g.* the [complexity zoo](https://complexityzoo.uwaterloo.ca), because many, many classes are already defined and you don't want to redefine one that is already known by some other name.

The ways I know of are:

* Define a complete problem and a notion of reduction; the class consists of all problems so reducible to that problem. This is usually only possible for so-called "syntactic" complexity classes -- see the question ["Semantic vs Syntactic Complexity Classes"](https://cstheory.stackexchange.com/questions/1233/semantic-vs-syntactic-complexity-classes) -- which tend to also have a nice definition in terms of a model of computation. (E.g. $\mathsf{NP}$ can be defined as all languages that are polytime mapping-reducible to $\mathsf{3SAT}$; or as all languages decidable by a polytime nondeterministic TM.)
* Define a model of computation and what it means for that model to decide/compute a language/problem; the class consists of all languages/problems for which there exists such a model of computation that decides/computes the language/problem. This works for probabilistic classes like $\mathsf{BPP}$, but also for more exotic models like quantum classes, circuits, interactive protocols, or finite automata for that matter. This is probably the method you'd go for, and for more detail, maybe look at examples of all the above types (e.g. $\mathsf{BPP, BQP, ACC, IP, MA, PCP, REGULAR}$).

Perhaps those more expert than I am can say if there are other major methods that are missing, or expand on these if needed.


---

### Answer by username_2 on 2014-05-14. Score: 11

First of all, you must justify why the class is important enough to have a name. With $ 2^{ 2^{ \mathbb{N}\_0 } }$ classes lying around we can afford to be very picky. So, assuming your research has led you to define an interesting property the problems in class have (this can be semantic or syntactic), let's call it "property X" you should first investigate the class on your own. I would try to answer the following questions:

* First step: Investigate the literature in the related research area. Has a class on objects from your research been defined? Ask experts in the area: "are there any known classes about this?". A little time spent asking might allow you to avoid losing time on something that is already known. So, let's assume you asked around and you have decided your class is unique enough and relevant to deserve study.
* Does "property X" specify a computation model? Is the model randomized or non-deterministic? Is the model uniform?
* How does your class behave under "usual" operations (union, complement, transitive closure etc.) . Note that if you work on a specific computation model, some questions may be trivial or easy to answer.
* How does your class compare to other known classes? If it's a specific model, how does it compare to "canonical" classes of that model (e.g. $\mathbb{NP}$ for non-deterministic TM, $\mathbb{BPP}$ for randomized TM, and so on)? Did you find some interesting closure property (e.g. is your class closed under complement? then perhaps non-determinism isn't a good framework to go on).
* How do well-known problems compare with your class? Does it contain complete problems, i.e. can you make it so that a well-known problem has "property X"? If you cannot, for what known notions of reductions is your class closed under? If those you know don't fit the class, can you use the closure properties you found above to define one that does and is less powerful than the class itself?
* Can you find problems that are hard for your class under some reduction that makes sense from the above step? Are they complete too? How do these problems compare with the well-known problems you investigated in the previous point? The problem < L | L has property X > should be hard for the class. Is it also complete?

Now, for most classes you should probably not be able to answer **all** those questions, but you can answer *some*, maybe most of them. Now you have an idea how this class behaves and whether it would be interesting for your line of research. If you deem it worthy, you can start asking people from the area, e.g. your advisor or a faculty that is familiar with the subject, what they think.

> **Comments:**
> **username_1**: I would add to the list of "usual" operations: closure under various types of reductions (such as $AC^0$-reductions, poly-time many-one reductions, poly-space many-one reductions, poly-time Turing reductions, etc.)  

---

