% -----------------------------*- LaTeX -*------------------------------ \documentclass[12pt]{report} \usepackage{scribe, epsfig} \newtheorem{defin}{Definition} \newtheorem{thm}{Theorem} \newtheorem{lem}{Lemma} \newcommand{\epb}{$\epsilon\mbox{-biased\ }$} \begin{document} % \course{MIT 18. 996} % optional %\coursetitle{Topic in TCS: Internet Research Problems} % \semester{Spring 2002} % optional \lecturer{Madhu Sudan, Ravi Sundaram} % required \scribe{Nicole Immorlica, Vahab S. Mirrokni} % required \lecturenumber{5} % required, must be a number \lecturedate{March 6} % required, omit year \maketitle % ---------------------------------------------------------------------- %\vspace{2cm} %\begin{center} %{\Huge Guessing Secrets} %\end{center} \vspace{0.5cm} \begin{center} %\begin{flushright} \small\sffamily\slshape Listen, Do you want to know a secret,\\ Do you promise not to tell, whoa oh, oh.\\ Closer, Let me whisper in your ear,\\ Say the words you long to hear...\\ \begin{flushright} \textup{--- Beatles, \\February 11, 1963} \end{flushright} \end{center} \vspace{1cm} \section{Motivation} Today, we will discuss issues that arise in DNS. First, let's review the DNS mechanism. \begin{figure}[h] \begin{center} \includegraphics[scale=0.66]{photo.eps} %\vspace{2cm} \end{center} \caption{the DNS mechanism} \label{fig} \end{figure} Akamai has thousands of webservers which cache the foo.com web page, and the goal of Akamai's authorative nameserver is to distribute the foo.com load somewhat evenly among these webservers. As nameservers cache IP addresses, each nameserver will direct all its clients to the same IP address. Thus each nameserver drags a load proportional to the number of its clients. However, we do not know the number of clients of a given nameserver. Furthermore, it is not enough to simply count the number of clients because some clients have more load than others. What we would really like is to find a mapping of nameservers to clients. To complicate matters, we must remember that a client may use more than one nameserver. Let's review the information we are given. Akamai's authorative nameserver knows the IP addresses of all the nameservers that submit foo.com queries. The Akamai webservers know the IP addresses of all the clients that request the foo.com webpage. Now how can we discover which clients were directed to each webserver by which nameserver? \begin{enumerate} \item IP addresses in the same block Perhaps we can assume that clients use nameservers whose IP addresses are in the same block as their own. As IP addresses in the same block tend to be geographically close, this assumption seems reasonable. However, it is unfortunately just not true. \item Direct each nameserver to a unique webserver and see which clients show up Clearly this approach works, but there are a myriad of implementation problems. The first major problem is that there are many more nameservers than webservers. Of course, we can try to sidestep this obstacle by repeating this procedure several times, keeping track of the set of clients at each webserver, taking some intersections, etc. Another major problem is that clients aren't continously requesting foo.com content, so in each iteration of this procedure, Akamai must wait a while to see all the clients that show up. \item Dynamically create a ``fake'' link that encodes client IP on the foo.com webpage In this solution, the Akamai webserver dynamically adds a one pixel gif to the foo.com webpage with the web address %.foo.com client.foo.com. As the client renders the webpage, it will make another request to its nameserver for the IP address of %.foo.com client.foo.com. When its nameserver asks Akamai's authorative nameserver to resolve this address, the authorative nameserver can associate this client to this nameserver. This solution solves our problem and appears to work even though it creates a bit of additional traffic. However, each nameserver now needs to make a unique query for every of its clients. Even if the time-to-live of the reply is zero, some faulty nameserver implementations will try to cache all these unique queries. This floods the cache of the nameserver, and, in some cases, actually crashes the nameserver. While this may appear to be the nameserver's problem, Akamai needs to market its solutions and it is hard to market a solution that breaks existing albeit faulty infrastructure. \item Statically force a client to reveal each bit of its nameserver's IP address In this solution, Akamai adds $32$ one pixel gifs to the foo.com webpage with the addresses $i$.foo.com for $0\leq i < 32$. Akamai also designates $64$ webservers, $i_j$ for $0\leq i < 32$, $j\in\{0,1\}$, to host the one pixel gifs. The Akamai authorative nameserver answers a query for $i$.foo.com with webserver $i_j$ where $j$ is the $i$th bit of the IP address of the questioning nameserver. By observing which of the $64$ webservers a client visited, we can now reconstruct the client's nameserver's IP. % vahab - mention what we are really doing in this solution is asking % the client 32 yes/no questions about his secret - his nameserver's ip % address. also, if a client has more than 2 nameservers, doesn't % madhu's algorithm misguide us? if so, why is it so much better than % this algorithm? i mean, 2 isn't much bigger than 1. This solution solves the problems of the last solution because now each nameserver will cache just a constant number (i.e. $32$) of IP addresses, namely $i$.foo.com for $0\leq i < 32$. However, this solution no longer solves our problem when a client uses more than one nameserver. \end{enumerate} \section{Problem Statement} Notice in the last solution, what we are really doing is asking the client $32$ yes/no questions about its nameservers' IP addresses. Namely, we ask $32$ questions of the form ``What is the $i$th bit of your nameserver's IP address?''. The client then selects one of its nameservers and answers our question truthfully. But this strategy fails to give us any information if the client has more than one nameserver. For example, if the client had a nameserver with an all-zeros IP address and a nameserver with an all-ones IP address, he could answer our $32$ questions in any of the $2^{32}$ possible ways. Thus this strategy allows us to reach no conclusion regarding its nameservers' IP addresses. In this section, we will extend this strategy by asking more questions. In this way, we hope we will be able to conclude more information about the possible nameservers of the client. First we give a formal definition of our problem: \begin{defin} {\em The Guessing Secrets Problem:} Alice (the adversary) has a set $S=\{X_1, \ldots, X_k\}$ of $k$ secrects, taken from a universe $\Omega$ of size $N$. Bob asks Alice a series of ``questions'' $\{F_i|F_i:\Omega \rightarrow \{0, 1\}\}$. For each $F_i$, Alice selects some $X_i\in\Omega$ and returns $\{F_i(X_i)\}$. Bob then outputs a set $G$ of sets of secrets which is its guess concerning the possibilities for the set $S$. %The job of Bob is to select questions so as to determine as much about the %secrets as efficiently as possible. % -- efficiency is not part of the definition \end{defin} There are two kinds of strategies for Bob, namely {\em adaptive} and {\em oblivious}. \begin{defin} In an {\em adaptive} strategy, Bob can design questions based on previous answers. In this case, Bob first asks question $q_1$ and Alice answers $a_1$. Then Bob asks question $q_2$ and Alice answers $a_2$ and so on. \end{defin} \begin{defin} In an {\em oblivious} strategy, all of Bob's question must be asked in advance of any of Alice's answers. Now, Bob asks $q_1, q_2, \ldots, q_m$ and Alice then answers all of them $a_1, a_2, \ldots, a_m$. \end{defin} In this definition, Alice corresponds to the client, its nameservers, and Akamai's authorative nameserver. Alice's secrets correspond to her nameservers' IP addresses. Bob corresponds to Akamai's webservers. The questions of an oblivious Bob are embedded as links in the original foo.com webpage and the answers are computed by Akamai's authorative nameserver upon queries from the client's nameservers. An adaptive Bob can also be implemented in this setting by embedding the link for question $q_i$ in the page for question $q_{i-1}$. We say Bob has solved the guessing secrets problem if he has learned as much as is theoretically possible concerning $S$. Observe that Bob can never hope to learn with certainty more than one of Alice's secrets, since Alice can always answer every question using the same $X_i$. We can in fact completely characterize the amount of information Bob can hope to learn about $S$, but first we will develop a model of this problem. \begin{defin}{\em The Graph Model:} Let $K_N$ denote the complete hypergraph with edge sets of size $k$ on the set of $N$ vertices of $\Omega$. A set of secrets $S=\{X_1, \ldots, X_k\}$ corresponds to an edge $(X_1,\ldots,X_k)$ of $K_N$. Each question $F_i:\Omega \rightarrow \{0, 1\}$ partitions the vertices of the graph into two sets, $F_i^{-1}(0)$ and $F_i^{-1}(1)$. \end{defin} Notice in this model, an answer $b\in\{0,1\}$ to the question $F_i$ implies at least one of the $X_i\in S$ are in $F_i^{-1}(b)$. Thus all edges in $F_i^{-1}(1-b)$ can be eliminated as possibilities for the set of secrets. Therefore, no matter how adversarial Alice acts, Bob can always ask questions that will reduce the resulting graph to a set of intersecting edges (i.e. a {\it star} or a {\it triangle} for $k=2$), for if there were disjoint edges Bob could add a question which separates the edges and thereby eliminate one of them. Furthermore, Bob can not hope to learn more than this. % is there an easy way to see this? Now we can say formally that Bob solves the guessing secrets problem if he returns an intersecting set of edges $G$ whose union contains $S$. %intersecting set of edges $G$ that contain $S$. We call a strategy of Bob that returns an intersecting set for any adversary a {\it separating} strategy, and the set of edges returned a {\it surviving} set. \section{Solutions} Clearly oblivious and adaptive separating strategies do exist. For example, Bob can simply ask the $O(N^k)$ questions corresponding to all cuts which separate one edge from the rest of the graph. However, this strategy is a bit discouraging because the information we are trying to learn is of size $O(k\log N)$. In order for our strategy to be considered {\it efficient}, we would like to ask just poly$(k,\log N)$ questions each of size poly$(k,\log N)$. Furthermore, in order to recover the surviving set from Alice's questions, Bob must spend $O(N^k)$ computation time (list all $k$-sets and eliminate inconsistent ones). In order for our strategy to be considered {\it invertible}, we would like to be able to recover the surviving set in just poly$(k,\log N)$ time. But just how efficient a strategy can we design? In \cite{CGL}, Chung et al. proved the following theorems for the case with $k=2$ secrets: \begin{thm} Let $f(N)$ be the smallest number of questions Bob must ask in an adaptive separating strategy for an initial set $\Omega$ of size $N$. Then, $$3\log_2(N)-5\le f(N)\le 4\log_2(N)+3, \mbox{\ for\ } N>2 $$ \end{thm} \begin{thm} Let $f(N)$ be the smallest number of questions Bob must ask in an oblivious separating strategy for an initial set $\Omega$ of size $N$. Then, $$f(N)\le (c+o(1))\log_2 N$$ where $c=3/\log {8\over 7}=15.57\ldots$. \end{thm} The proofs of the upper bounds in these theorems either use the probabilistic method (and thus are non-constructive) or construct strategies that have large question sizes and not invertible. Chung et al. explicitly construct several strategies, but they are all less than optimal in some sense. Recently, Micciancio et al. \cite{MS01} presented an adaptive strategy with the optimal $O(\log N)$ questions and an $O(\log^2 N)$ time algorithm for recovering $k=2$ secrets. Today, we will see a result published by Alon et al. \cite{AGKS} that gives an invertible oblivious strategy with the optimal $O(\log N)$ questions for $k=2$ secrets. This strategy depends heavily on error-correcting codes. To motivate the use of error-correcting codes in problems like guessing secrets, we first present a similar problem {\em 20 questions}, and solve it with error-correcting codes. \subsection{20 questions with a liar} In the 20 questions game a player, Bob, tries to discover the identity of some unknown secret drawn by a second player, Alice, from a large space of $N$ secrets. Bob is allowed to ask Alice binary (Yes/No) questions about the secret. Alice answers each question truthfully according to her secret. The goal of Bob is to learn the secret by asking as few questions as possible. If the $N$ possible secrets are associated with $\lceil \log N \rceil$-bit strings, then clearly $\lceil \log N \rceil$ questions are both necessary and sufficient to discover the secret. The guessing secrets problem is a generalization of this game in which Alice picks not one, but $k$ secrets, and answers questions truthfully according to a secret of her choice. There is another way of generalizing 20 questions game. In this generalization, Alice again has just one secret $x$, but she is allowed to lie, say, 10\% of the time. Equivalently, we can pretend Alice always answers truthfully, but she transmits her answers through a noisy channel which corrupts 10\% of the bits. Error-correcting codes are an obvious solution to this problem. Bob can pick an appropriate code $C$ with encoding function $E$ and decoding function $D$. He asks Alice about each bit of $E(x)$. The resulting string $E(x)$ will be a codeword with at most 10\% error in it. Thus, if Bob uses an error-correcting code with error recovery better than 10\%, then he can recover the secret $D(E(x))$. Luckily for Bob, we know of codes that can correct strings with less than 50\% error. We would like to apply the same approach to the guessing secrets problem. We consider one secret $X_1$ as the ``true'' secret, and all other secrets as lies. We then try to apply Bob's error-correcting code strategy. However, there is a problem. Namely, even with just two secrets, Alice can lie 50\% of the time if we don't pick our code carefully. Clearly, there are no error-correcting codes with 50\% error recovery. But, we have a stronger assumption than in the liar game. Alice's lies must be consistent! That is, Alice's lies are just bits of $k-1$ other codewords. We will use this fact to define a class of codes, and encoding and decoding strategies for these codes. \subsection{Separating codes} We will concern ourselves with the 2-secret guessing problem (i.e. $k=2$). For each secret $x\in \Omega$, we denote the sequence of answers to the questions $F_i$ on $x$ by $$C(x) =\langle F_1(x), F_2(x), \ldots, F_n(x)\rangle.$$ We call the mapping $C:\Omega\rightarrow \{0, 1\}^n$ thus defined as the code used by the strategy. There is clearly a one-one correspondence between oblivious strategies $\{F_i\}$ and such codes $C$ (defined by $F_i(x) = C(x)_i$, where $C(x)_i$ is the $i$'th bit of $C(x)$). Now we can refer to a strategy using its associated code $C$. We say that a code $C$ is {\em $(2, 2)$-separating} if for every $4-tuple$ of distinct secrets $a,b,c,d\in \Omega$, there exists at least one value of $i$, $1\le i\le n$, called the {\em discriminating index}, for which $C(a)_i= C(b)_i \not = C(c)_i = C(d)_i$. Note that if Bob asks questions according to a separating code $C$, then for every two disjoint pairs of edges $(a,b)$ and $(c,d)$, Bob can rule out one of them based on the answer which Alice gives on the $i$'th question, where $i$ is a discriminating index for the $4$-tuple $(a,b,c,d)$. In fact it is easy to see that the $(2,2)$-separating property of $C$ is also necessary for the corresponding strategy to solve the 2-secrets guessing game. Thus, there exists a $(2,2)$-separating code $C: \Omega\rightarrow \{0, 1\}^n$ if and only if there exists an oblivious strategy for Bob to solve the 2-secret guessing problem. Now all that remains is to find good $(2,2)$-separating codes. We use the following theorems and definitions to design such codes efficiently: \begin{thm} \label{22sep}\cite{AGKS} Let C be an $[n, m]_2$ binary linear code with minimum distance $d$ and maximum distance $m_1$. Assume further that $d, m_1$ satisfy the condition $d>{3m_1\over 4}$. Then, $C$ is a $(2, 2)$-separating code. \end{thm} \begin{defin} A binary linear code of block length $n$ is an \epb code if every non-zero codeword in $C$ has Hamming weight between $({1\over 2}-\epsilon)n$ and $({1\over 2} + \epsilon)n$. \end{defin} From above theorem and definition, one can easily conclude that if a binary linear code $C$ is \epb for some $\epsilon\le {1\over 14}$, then $C$ is $(2,2)$-separating. A simple explicit construction of \epb codes can be obtained by concatenating an outer Reed-Solomon code with relative distance $(1-2\epsilon)$ with an inner binary Hadamard code. However, this and other similar constructions encode our strings of length $\log N$ into codewords of length $O({\log^2 N\over\epsilon^2})$, more than the desired $O(\log N)$ length. %But, there are also known ways to achieve \epb codes with block length %$O({m\over \epsilon^{O(1)}})$. For example, we can use a concatenated %scheme with outer code any explicitly specified specified code with %relative distance $(1-O(\epsilon))$ over a constant alphabet size (that %depends on $\epsilon$), and inner code as a Reed-Solomon concatenated %with Hadamard code. However, in \cite{ABN} Alon et al. proved: \begin{lem} For any $\epsilon >0$, there exists an explicitly specified $[O(\frac{m}{\epsilon^3}),m]_2$ family of \epb codes. \end{lem} Since the codes from this lemma have constant rate, we see that there is an explicit oblivious strategy for the 2-secrets guessing game that uses $O(\log N)$ questions. The problem of above method is that it is not invertible. Next we will design an invertible strategy that recovers secrets in poly($\log N$) time. \subsection{List Decoding} Again, we consider the 2-secrets guessing game (i.e. $k=2$). \begin{thm} \label{ld} Suppose that $C$ is a $[cm,m]_2$ binary linear code which is \epb for some constant $\epsilon <{1\over 14}$. Suppose further that there exists a list decoding algorithm for $C$ that corrects up to a ${1\over 4}+{\epsilon \over 2}$ fraction of errors in time $O(T(m))$. Then, $C$ is $(2,2)$-separating code that gives a strategy to solve the $2$-secrets guessing game for a universe size of $N=2^m$ in $O(T(\log N) +\log^3 N)$ time using $c\log N$ questions. \end{thm} \begin{proof}[Sketch] Suppose Bob uses the code $C=[n\equiv cm,m]_2$ mentioned above for his strategy. If Alice's secrets are $\{X_1, X_2\}$ and her answers to Bob are ${\bf a} = (a_1, a_2, \ldots, a_n)$, then for each $i$, we must have either $C(X_1)_i = a_i$ or $C(X_2)_i=a_i$. As $C$ is \epb, $C(X_1)$ and $C(X_2)$ must agree in at least $({1\over 2}-\epsilon)n$ coordinates. Furthermore, since Alice doesn't lie, at least half of the $({1\over 2}+\epsilon)n$ remaining coordinates must agree with one of the codewords, say $C(X_1)$. This means ${\bf a}$ has a Hamming distance of at most $({1\over 4}+{\epsilon\over 2})n$ from $C(X_1)$. To recover the secrets, Bob should, \begin{enumerate} \item Perform list decoding of the code $C$ using the assumed algorithm to find the set $$S=\{x\in \{0, 1\}^m|\Delta({\bf a}, C(x))\le ({1\over 4}+{\epsilon\over 2})n\}$$ where $\Delta(x,y)$ denotes the Hamming distance between $x$ and $y$. \item For each $x\in S$, let $A$ be the set of coordinates where $C(x)$ and ${\bf a}$ agree. Find the set of possible matching secrets $S_x$ by setting the coordinates $A$ of ${\bf a}$ to variables and finding all solutions $x'$ to the linear system of equations $C(x')={\bf a}$ (this is a linear system because $C$ is a linear code). If $S_x$ is empty (i.e. there is no $x'$ such that Alice could have answered ${\bf a}$ with secrets $(x,x')$), then remove $x$ from $S$. Otherwise, represent $S_x$ by a set of basis vectors. \item Return the set $G=\{\{x, x'\}: x\in S, x'\in S_x\}$ as the guess. \end{enumerate} Notice a set of secrets $\{x,x'\}$ is in $G$ if and only if it is consistent with the answer ${\bf a}$, so in particular Alice's real secrets $\{X_1,X_2\}\in G$. Furthermore, as $\epsilon <{1\over 14}$, theorem~\ref{22sep} implies $C$ is $(2,2)$-separating and therefore $G$ is an intersecting family. This shows the correctness of Bob's strategy. The efficiency of the inversion follows as list decoding returns a constant number of solutions, so we must solve just a constant number of linear systems. Furthermore, due to our clever representation of $S_x$, our output is polynomial in $\log N$ even when the number of vertices in our intersecting family is $O(N)$ (e.g. the star with $(N-1)$ non-hubs obtained when ${\bf a}=C(x)$ for some $x$). \end{proof} For detailed proof of correctness and analysis of this algorithm, see \cite{AGKS}. Also, notice if you don't believe theorem~\ref{22sep}, you can use the naive graph-cut approach on the constant-sized set $S$ of vertices returned by the list decoding. To implement this so that the strategy remains oblivious, assign an ordering to the secrets $S$ output by the list decoding algorithm. Consider the complete graph $K_{|S|}$ on $|S|$ vertices. For every pair of vertices $i$ and $j$ in $K_{|S|}$, Bob asks Alice ``If you use my list decoding algorithm, is your secret in the set $\{i,j\}$?'' Bob then eliminates edges in $K_{|S|}$ as discussed. If both of Alice's secrets are in $S$, then the result of this algorithm will be a star or a triangle. If just one of her secrets is in $S$, then the result of the algorithm will be a star and {\it not} a triangle. Thus, if the result is a triangle, returning the triangle will give a correct solution $G$. If the result is a star, we can not tell if just one or both secrets are already in the star. However, extending the star to the whole set $\Omega$ will give a correct solution $G$. The only remaining problem is to prove the existence of the \epb codes used in theorem~\ref{ld}. The existence of such codes is a standard result of coding theory. \begin{theorem} For every positive constant $\alpha < 1/2$, the following holds. For all small enough $\epsilon>0$, there exists an explicit asymptotically good family of binary linear \epb codes which can be list decoded up to an $\alpha$ fraction of errors in $O(n^2({\log(n) \over \epsilon})^O(1))$ time. \end{theorem} A sketch of this result may be found in \cite{AGKS}. \section{Open Questions} There are numerous questions about the guessing secrets problem that remain open, most of which involve some generalization or restriction of the problem. We conclude with a list some of the open questions. \begin{enumerate} \item{$k$-Secret Guessing Problem} In the last two sections, we analayzed strategies for $k=2$ secrets. A natural question is to analyze the case for $k>2$. Note that the list decoding solution no longer works because Alice's answer may be quite far from the codewords of her secrets. The hypergraph model and accompanying naive algorithm show that strategies do exist for $k>2$. But, as stated, the naive strategy is impractical. We do have some negative results for this problem. In particular, Alon et al. showed~\cite{AGKS} oblivious strategies require at least $\Omega(2^{2k}\log N)$ questions and adaptive strategies require at least $a_k\log N - a_k\log a_k$ questions where $$a_k=2k-2+\frac{1}{2}{{2k-2}\choose {k-1}}.$$ Furthermore, they present an efficient (but not invertible) oblivious strategy for this problem based on $2k$-universal families of binary strings that uses at most $ck2^{6k}\log N$ questions for some constant $c$ independent of $k$. \item{Relax Solution Condition} We can consider a restricted form of the problem in which we only require Bob to return a guess set $G$ such that any $k$-set of secrets $S$ that is consistent with Alice's answers intersects $G$ in at least one element~\cite{AGKS}. In this case, there is an efficient invertible oblivious strategy for Bob based on concatenated codes and the same list decoding ideas presented here. It may be possible to improve this result, and algorithms for adaptive strategies should be studied. \item{Non-binary Questions} Another way to generalize our problem is to allow Bob to ask questions with more than two answers. Clearly, this makes the problem much easier for Bob. For example, in the $2$-secret problem, Bob can now always determine at least one of Alice's secrets (he can eliminate triangles by asking a tertiary question). However, it is not known how non-binary questions affect the problem for $k>2$. \item{Fixed Number of Rounds} We can also restrict the problem by allowing Bob only a fixed number of rounds in the adaptive case. If we allow Bob to ask more than one question per round, this problem becomes a sort of hybrid between the oblivious and adaptive strategies. How can we combine the solutions for oblivious and adaptive strategies to get an optimal strategy in this case? \item{Lying} Finally, we can allow Alice to lie some fraction of the time. That is, for say 10\% of the questions, Alice can give any answer she chooses, independent of her secrets. Can we find codes such that this new power doesn't help Alice too much? How about in the adaptive case? \end{enumerate} \begin{thebibliography}{AAM9} \bibitem{ABN} {\sc N. Alon, J. Bruck, J. Naor, M. Naor, and R. Roth.} {\it Construction of asymptotically good low-rate error-correcting codes through pseudo-random graphs.}, IEEE Trans. Info. Thy., 38(2):509--512, March 1992. \bibitem{CGL} {\sc Fan R. K. Chung and Ronald Graham and Frank Thomson Leighton}, {\it Guessing Secrets}, Symposium on Discrete Algorithms, p723-726, 2001. \bibitem{AGKS} {\sc Noga Alon, Venkatesan Guruswami, Tali Kaufman, Madhu Sudan}, {\it Guessing Secrets Efficiently via List Decoding}, SODA 2002. \bibitem{MS01} {\sc Daniele Micciancio, and Nathan Segerlind.} {\it Using prefixes to efficiently guess two secrets.}, Manuscript, July 2001. \end{thebibliography} %\begin{danger} %That's dangerous. %\end{danger} % %\section{Challenges in Internet Ages} % %The internet can be too slow. %The following Theorem showed that we can always speedup the internet. % %\begin{theorem} %If the current internet configuration yields average access speed $s$, then there is %another internet configuration that yields average access speed at least $2s$. %\end{theorem} % %\begin{proof}[folklore] %By applying Akamai Technologies, %\begin{equation} %\hat{s} = \sum_{i=1}^{\infty} \hat{s}_i \ge 2s %\end{equation} %Therefore the theorem is true. %\end{proof} % %Therefore, we can put much junks on internet as possible!!!! % %\begin{ddanger} %Really really dangous!!! %\end{ddanger} % %\subsection{Information Searching is Hard} % %Google is very powerful, but it still returns too much information on a query. % % %\begin{table}[htop] %\centerline{ % \begin{tabular}{|l|lr|} % \hline % \textbf{Query Type/Expectation} & Low & High \\ % \hline % Single Key Word & Fast/Fun & Too much junks \\ % Logical Expression & Better/Happy & Lots of work/little benefit\\ % Really Smart Query & Kick Ass/Owa!! & Kick Ass/Happy \\ % \hline % \end{tabular}} %\caption{Internet Psychology. } %\end{table} % %So life is hard. % %\subsection{How Much Disk Space Do We Need? } % %The internet is getting faster and faster, and the information junks is getting %more and more. Does that imply that we should invest in companies that produce %hard disks. % % %\begin{corollary} %There is a constant $\lambda > 1$ such that if the internet speedy doubles, then %the amount of disk spaces needed to support the internet increases by a factor of $\lambda$ \qed %\end{corollary} % %But which company shall we invest in? % %\vfill %\begin{flushright}\small\sffamily\slshape %Predication is hard, especially about future....\\{} %[Invest in as many promising hard disk companies as possible]\\ %\textup{--- Wall Street Analyst, \textsl{New York City} (Jan. 2000)} %\end{flushright} % \end{document}