Предполагая, что K_1 и K_2 являются допустимыми ключами, должно существовать следующее:
gcd(K_1, φ(φ(N))=1
и gcd(K_2, φ(N))=1
где φ
- функция Эйлера.
Учитывая это, мы знаем, что K_1 и K_2 должны быть нечетными . С информацией о том, что эти ключи отличаются только на 1 бит, мы знаем, что gcd(K_1, K_2)=1
. Это означает, что существует r s
, такой как rK_1 + sK_2 = 1
(определение gcd
).
Мы знаем, что C_1 = E(M,K_1)
и C_2 = E(M,K_2)
.
Давайте умножим C_1^r
на C_2^s
и посмотрим, что получим:
C_1^r * C_2^s = (M^K_1)^r * (M^K_2)^s = M^(rK_1 + sK_2) = M^1 = M
Мы нашли оригинальное сообщение M.
Мне нравится использовать анонимные типы, когда мне нужно привязать коллекцию, которая не совсем соответствует тому, что мне нужно. Например, вот пример из моего приложения:
var payments = from terms in contract.PaymentSchedule
select new
{
Description = terms.Description,
Term = terms.Term,
Total = terms.CalculatePaymentAmount(_total),
Type=terms.GetType().Name
};
Здесь я затем связываю сетку данных с payment.ToList (). Дело в том, что я могу объединять несколько объектов без единого определения промежуточного звена.
I often use them when databinding to complex controls -- like grids. It gives me an easy way to format the data I'm sending to the control to make the display of that data easier for the control to handle.
GridView1.DataSource = myData.Select(x => new {Name=x.Description, Date = x.Date.ToShortDate() });
But, later on, after the code is stable, I will convert the anonymous classes to named classes.
I also have cases (Reporting Services) where I need to load them using non-relational data, and Reporting Services requires the data to be FLAT! I use LINQ/Lambda to flatten the data easily for me.
Анонимные типы обеспечивают удобный способ инкапсулировать набор только для чтения свойства в один объект без необходимости сначала явно определить тип.
Анонимные типы полезны в областях, где вы обычно используете определенную структуру, но не хотите, потому что она будет использоваться только в ограниченной области. Я склонен использовать их в качестве источников данных или в качестве контейнеров для совокупных (сумма, количество и т. Д.) Значений.
LINQ / Lambda
var quantity = ...
var query = db.Model.Select( m => new
{
Name = m.Name,
Price = m.Price,
Cost = M.Price * quantity
} );
foreach (var q in query)
{
Console.WriteLine( q.Name );
Console.WriteLine( q.Price );
Console.WriteLine( q.Cost );
}
ASP.NET MVC -HtmlHelpers или при возврате JSON
<%= Html.TextBox( "Name", Model.Name, new { @class = "required" } ) %>
public ActionResult SearchModels( var q, int limit )
{
var query = db.Models.Where( m => m.Name.StartsWith( q ) )
.Take( limit )
.Select( m => new { m.DisplayName, m.Name, m.ID } );
return Json( query.ToList() );
}
На самом деле, практически везде, где вам просто нужен временный тип контейнера для кратковременного действия.
Я считаю, что они являются очень полезной заменой для простой структуры / структура объектов, особенно при работе с VB.NET, поскольку он не поддерживает автоматически реализуемые свойства.
Здесь есть хорошее сообщение в блоге Чарли Калверта об использовании анонимных типов.
Лично я не нахожу много пользы для анонимных типов. Они, безусловно, должны использоваться с крайней осторожностью. Ситуация, в которой они обычно используются, возникает при создании запросов LINQ, которые возвращают несколько значений, и вам нужно использовать запрашиваемые данные только для выполнения функции. (Если данные должны использоваться снаружи, тогда анонимные типы не могут использоваться - вам нужно объявить свои собственные, и по уважительной причине, например, читаемость.) В более общем случае они иногда могут быть полезны при использовании простых лямбда-выражений, хотя опять я сам требовал их очень редко. (Когда я говорю «требуется», в зависимости от контекста существуют почти альтернативные варианты, но иногда [116621] анонимные типы являются наиболее элегантным вариантом.) Если вам нужен пример кода,
Они полезны при использовании LINQ
var query = from c in listOfCustomers
select new {FirstName = c.Name,c.City};
Взгляните на это Введение в LINQ